Methods
Site Descriptions
  A total of 31 sites were monitored at 6 parks within the Northeast Coastal and Barrier Network, including Assateague Island National Seashore (ASIS; Maryland and Virginia), Colonial National Historical Park (COLO; Virginia), Fire Island National Seashore (FIIS; New York), Gateway National Recreation Area (GATE; New Jersey and New York), George Washington Birthplace National Monument (GEWA; Virginia), and Sagamore Hill National Historic Site (SAHI; New York) (Figure 1). Salt marsh vegetation cover was monitored between 2008 to 2018, although not all sites were measured in every year. Specifically, site GSH1 at GATE was the only site measured in 2014, whereas all 3 sites (GSH1, GSH2, GSH3) were measured in 2010, 2012, 2016, and 2018. Similarly, at COLO, sites sites C1, C5, C6, and C8 were measured in 2008 and 2010, but sites C5, C13, C19, C23, and C30 were measured in 2012, 2014 and 2016. Thus, only site C5 was measured consistently across all 5 sampling years (2008, 2010, 2012, 2014, 2016) at COLO. Additional details of the monitoring scheme used at each park are presented in Table 1.

 

Figure.1  

Table 1. Site count, plot count, monitoring years, and count of sampling events at each park.

Park Unit

Unit Code

Location

Number of Sites

Site List

Number of Plots

Sample Years

Sampling Events

Assateague Island National Seashore

ASIS

MD, VA

9

A10, A11, A2, A3, A4, A5, A6, A8, A9

2,125

2008, 2010, 2012, 2014, 2016, 2018

6

Colonial National Historical Park

COLO

VA

8

C1, C13, C19, C23, C30, C5, C6, C8

1,043

2008, 2010, 2012, 2014, 2016

5

Fire Island National Seashore

FIIS

NY

9

F1, F2, F3, F4, F5, F6, WF1, WF2, WF3

2,395

2009, 2011, 2013, 2015, 2017

5

Gateway National Recreation Area

GATE

NJ, NY

3

GSH1, GSH2, GSH3

413

2010, 2012, 2014, 2016, 2018

5

George Washington Birthplace National Monument

GEWA

VA

1

G1

140

2008, 2010, 2012

3

Sagamore Hill National Historic Site

SAHI

NY

1

SAG1

225

2009, 2011, 2013, 2015, 2017

5

Sampling Protocol
  x, y, z.

 

Data Analyses
  In many instances, the total percent cover was recorded as adding to over 100%. In order to standardize the percent cover values between plots, we converted the percent cover of each species to relative percent cover by dividing the percent cover of each species in a plot by the total plant cover of the entire plot. The frequency of occurrence for each species was calculated as the proportion of plots at a site in which a species was found.
   We compared the salt marsh plant community between and within the 6 park units using the following metrics: average total plot cover, average plot-level species richness, maximum plot-level species richness, total park-level species richness, number of species unique to each park, Shannon’s diversity index, and Inverse Simpson’s diversity index. Average plot-level species richness represents the average number of species recorded in each plot. Maximum plot-level species richness was derived from the plot with the highest species richness found among all plots at each park. Total park-level species richness was calculated as the total number of distinct species found across all plots at each park. The number of unique species at each park represents the count of species at a park that were not found at the other 5 parks. Shannon’s Diversity Index ranges from 0 to infinity, with lower values representing lower diversity. The Shannon index is an information statistic index, which means it assumes all species are represented in a sample and that they are randomly sampled. Simpson’s Diversity Index ranges from 0 to 1, with 0 representing infinite diversity and 1 representing no diversity. The Simpson index is a dominance index because it gives more weight to common or dominant species. Conversely, the Inverse Simpson Index, which is calculated as the inverse of the Simpson Index (1/D), ranges from 1 to infinity, with lower values representing lower diversity.
  With the exception of total park-level species richness and the number of unique species at each park, we first calculated the value of each metric for each plot within each site for each year, and then averaged these plot-level values up to the site-level for each year. Comparisons between parks are presented as bar graphs of park-level averages with the park unit on the x-axis and respective metric on the y-axis. Comparisons over time within each park are presented as line graphs with the sample years on the x-axis and the respective metric on the y-axis, with separate panels for each park unit. Error values and error bars represent the standard error of the site-level yearly values.

 

Results
Total Cover
  Average total plot cover decreased over the study period at all parks, although the decrease in total cover was more pronounced at some parks than others (Figure 2). For example at FIIS, GEWA, and SAHI, total plot cover declined substantially between the first sampling event to the last sampling event and showed no signs of recovery (Figure 2c, 2e, and 2f). Alternatively, total plot cover at ASIS, COLO, and GATE declined from the beginning of the study period and appeared to reach a low in 2014, 2012, and 2016 (respectively), but then appeared to recover during the following sampling events (Figure 2a 2b, and 2d).

 

 

Species Richness
  In total, we identified 156 unique plant species within the salt marshes at all 6 parks. Average plot-level species richness varied little from year to year at all parks throughout the study period (range: 1.2 to 3.6 species per plot) (Figure 3). Maximum plot-level species richness decreased across the entire study period at all parks except COLO and GATE (Figure 3). At COLO, maximum plot-level species richness declined from 7 in 2008 to 6 in 2012, but then increased back to 7 in 2016 (Figure 3b). At GATE, maximum plot-level species richness doubled from 5 in 2014 to 10 in 2018 (Figure 3d). Notably, maximum plot-level species richness at FIIS increased from 7 in 2009 to 9 in 2015 before decreasing substantially to 6 in 2017 (Figure 3c). Total park-level species richness decreased across the entire study period at all parks except COLO and GATE (Figure 4). Notably, total park-level species richness declined dramatically at both ASIS and GEWA. At ASIS, total park-level species richness declined from a high of 28 in 2010 to a low of 12 in 2012 (Figure 4a). Similarly, at GEWA, total park-level species richness declined from a high of 34 in 2008 to a low of 18 in 2010 (Figure 4e). Conversely, total park-level species richness increased from a low of 23 in 2008 to a high of 28 in 2016 at COLO (Figure 5c), and also increased from a low of 13 in 2014 to a high of 43 in 2018 at GATE (Figure 4d). Finally, the number of species unique to each park decreased across the entire study period at all parks except COLO and GATE (Figure 4). At COLO, the number of species unique to the park doubled from 4 in 2008 to 8 in 2016 (Figure 4b). At GATE, the number of species unique to the park increased substantially from a low of 2 in 2014 to a high of 25 in 2018 (Figure 4d).

 

 

 

Rare, Threatened & Endangered Species
  Only 12 rare species - Myrica gale - was identified. Myrica gale is considered rare by the state of New Jersey and was only found in one plot at GATE in 2017. No federally listed threatened or endangered species were found at any of the parks.

 

Invasive, Noxious & Prohibited Species
  Of the 156 unique species identified across all parks, 7 were considered invasive, noxious, or prohibited within their respective states. No invasive species were found in ASIS, GEWA, or SAHI. At COLO, only 1 species - Najas minor - was considered invasive by the Virginia Department of Conservation and Recreation (https://www.dcr.virginia.gov/natural-heritage/invsppdflist). At FIIS, 3 species, including Elaeagnus umbellata, Phragmites australis, and Polygonum perfoliatum, were considered invasive by the state of New York (State of New York, 2022). At GATE, 4 species, including Artemisia vulgaris, Lonicera japonica, Phragmites australis, and Rubus phoenicolasius were considered invasive by the state of New York (State of New York, 2022). Notably, Phragmites australis was found in multiple years at both FIIS and GATE (Figure 5b). Of the 7 invasive species found, 4 species were found in only 1 year, including Najas minor at COLO in 2016, Elaeagnus umbellata and Polygonum perfoliatum at FIIS in 2015, and Rubus phoenicolasius at GATE in 2018. At FIIS, the average relative cover of Phragmites australis declined from % in 2009 to % in 2015, but then increased back to % in 2017 (Figure 5a). At GATE however, the average relative cover of Phragmites australis declined from % in 2012 to % in 2016 (Figure 5b). Also at GATE, the average relative coverage of Artemisia vulgaris increased substantially from % in 2014 to % in 2018 (Figure 5b). Similarly, the average relative cover of Lonicera japonica at GATE increased from % in 2012 to % in 2018 (Figure 5b).

 

 

Salinity Tolerance
  At ASIS, the count of species with low and medium salinity tolerance decreased between 2008 to 2018, whereas the count of species with high salinity tolerance remained stable (Figure 6a). Similarly, the frequency of occurrence of species in all salinity tolerance categories remained stable (Figure 6b). However, the average relative cover of species with low salinity tolerance decreased whereas the average relative cover of species with medium salinity tolerance increased, and the average relative cover of species with high salinity tolerance remained stable (Figure 6c).

 

 

  At COLO, the count of species with low and medium salinity tolerance increased between 2008 to 2016, whereas the count of species with high salinity tolerance remained stable (Figure 7a). Similarly, both the frequency of occurrence and average relative cover of species with low salinity tolerance increased substantially whereas the frequency and cover of species with high salinity tolerance decreased over the same time period (Figure 7b and c).

 

 

  At FIIS, the count of species with both low and high salinity tolerance increased between 2009 to 2017, whereas the count of species with medium salinity tolerance remained stable during this time (Figure 8a). The frequency of occurrence of species in all salinity tolerance categories remained stable (Figure 8b). The average relative cover of species with low and medium salinity tolerance initially declined between 2009 to 2013, but then recovered between 2013 to 2017, whereas the average relative cover of species with high salinity tolerance remained stable during this time (Figure 8c).

 

 

  At GATE, the count of species in all salinity tolerance categories remained stable between 2010 to 2018 (Figure 9a). The frequency of occurrence and average relative cover of species with medium salinity tolerance increased slightly over the study period (Figure 9b). The frequency of occurrence of species with low salinity tolerance also increased slightly but average relative cover initially increased between 2010 to 2016 but then declined substantially between 2016 and 2018 (Figure 9c).

 

 

  At GEWA, the count of species with low and medium salinity tolerance decreased between 2008 to 2012 (Figure 10a). Conversely, the frequency of occurrence of species with low and medium salinity tolerance increased slightly over the study period (Figure 10b). Interestingly, the average relative cover of species with high salinity tolerance increased slightly during the study period, although the average relative cover of species with low and medium salinity tolerance increased substantially between 2008 to 2010, and then declined slightly between 2010 to 2012 (Figure 10c).

 

 

  At SAHI, no species with low salinity tolerance were found throughout the entire study period. The count of species with high salinity tolerance decreased between 2009 to 2017 and the count of species with medium salinity tolerance remained stable (Figure 11a). The frequency of occurrence of species with high salinity tolerance increased slightly between 2009 to 2013, but then declined between 2013 to 2017 (Figure 11b). Conversely, the average relative cover of species in both the medium and high salinity tolerance categories declined between 2009 to 2013 but then increased between 2013 to 2017 (Figure 11c).

 

 

Community Composition
  No significant difference in community composition was found between any of the years at GATE (R2 = 0.42, p = ns). At ASIS, the permutational analysis of variance (ADONIS) found a significant difference in community composition between years (R2 = 0.41, p < 0.001). An examination of the pairwise comparisons between years at ASIS found significant differences between 2008 vs. 2016, 2008 vs. 2018, 2010 vs. 2014, and 2014 vs. 2018 (Figure 9). The species with the top 5 largest changes in cover that contributed to the differences between these 4 year-pairs at ASIS are shown in Figure 9. Some notable differences include:
Warning messages:
1: Unknown or uninitialised column: `m`. 
2: Unknown or uninitialised column: `m`. 
3: Unknown or uninitialised column: `m`. 
4: Unknown or uninitialised column: `m`. 
5: Unknown or uninitialised column: `m`. 
6: Unknown or uninitialised column: `m`. 
7: Unknown or uninitialised column: `m`. 
8: Unknown or uninitialised column: `m`. 
9: Unknown or uninitialised column: `m`. 

 

  At COLO, the permutational analysis of variance (ADONIS) found a significant difference in community composition between years (R2 = 0.34, p < 0.05). An examination of the pairwise comparisons between years at COLO found significant differences between 2008 vs. 2010, 2010 vs. 2012, 2010 vs. 2014, and 2010 vs. 2016 (Figure 10). The species with the top 5 largest changes in cover that contributed to the differences between these 4 year-pairs at COLO are shown in Figure 10. Some notable differences include:

 

  At FIIS, the permutational analysis of variance (ADONIS) found a significant difference in community composition between years (R2 = 0.30, p < 0.001). An examination of the pairwise comparisons between years at FIIS found significant differences between 2011 vs. 2017 and 2015 vs. 2017 (Figure 11). The species with the top 5 largest changes in cover that contributed to the differences between these 2 year-pairs at FIIS are shown in Figure 11. Some notable differences include:

 

Discussion

Species richness per plot at all parks was similar to that of other salt marshes along the eastern Atlantic coast of North America (citations here).

  The salt marsh plant community at ASIS has seen a reduction in total plot-level species richness (Figure 3a), total park-level species richness (Figure 4a), and count and cover of low salinity tolerant species (Figure 6a and 6c). The changes in this community are most likely a consequence of both climate change, land-use change, and sea-level rise. More specifically, increases in evapotranspiration due to above average air temperatures and or below average precipitation resulting from climate change have led to elevated salinities within the shallow coastal waters surrounding the marshes. Similarly, below average precipitation has also likely the decreased flow of tributaries to the coastal bays, which also contributes to elevated salinities. Finally, sea-level rise is likely decreasing the elevation of the marshes and pushing salt water farther inland into marsh areas that were not previously inundated with salt water, such that some less salt tolerant species are disappearing. Additionally, the stability in the frequency of occurrence (Figure 6b) of species within all salinity tolerance categories would suggest that either (a) the total area of all marsh habitats is decreasing (i.e., converting to open water), or that (b) more salt-tolerant species may be migrating up slope at the expense of less salt-tolerant species (see increase in cover of medium salinity tolerance species in Figure 6c).

Literature Cited

Lichvar, R.W., D.L. Banks, W.N. Kirchner, and N.C. Melvin. 2016. The National Wetland Plant List: 2016 wetland ratings. Phytoneuron 2016-30: 1-17. (See also the official website of the National Wetland Plant List.)

State of New York. 2022. New York Laws, Environmental Conservation § 9-170. New York Department of State. 2021. 6 New York Codes, Rules and Regulations Part 575: Prohibited and Regulated Invasive Species.

U.S. Army Corps of Engineers. 2009. Regional supplement to the Corps of Engineers Wetland Delineation Manual: Northcentral and Northeast Region. U.S. Army Corps of Engineers, Engineer Research and Development Center, Environmental Laboratory ERDC/EL TR-09-19.  

Appendix 1. Salt marsh plant cover species with the top 5 highest relative mean cover, frequency, and importance value in each park unit. A = annual species, all others are biennial or perennial; G = graminoid species; O = obligate wetland species, all others occur at least some of the time in upland conditions.

Park Unit

Species

Cover (%)

Species

Frequency

Species

Importance Value

ASIS

Spartina alterniflora GO

68.3

Spartina alterniflora GO

0.85

Spartina alterniflora GO

7.65

Spartina patens G

11.2

Distichlis spicata G

0.40

Distichlis spicata G

2.53

Distichlis spicata G

10.4

Salicornia maritima A

0.30

Spartina patens G

1.99

Salicornia maritima A

4.2

Spartina patens G

0.26

Salicornia maritima A

1.94

Iva frutescens

2.9

Iva frutescens

0.09

Salicornia bigelovii AO

1.14

COLO

Spartina cynosuroides GO

33.2

Peltandra virginica O

0.68

Spartina cynosuroides GO

5.65

Peltandra virginica O

31.4

Spartina cynosuroides GO

0.60

Peltandra virginica O

4.99

Schoenoplectus robustus GO

8.4

Schoenoplectus robustus GO

0.37

Zizania aquatica AGO

2.96

Zizania aquatica AGO

7.3

Zizania aquatica AGO

0.21

Schoenoplectus robustus GO

2.26

Spartina alterniflora GO

3.4

Schoenoplectus pungens var. pungens G

0.17

Polygonum

1.84

FIIS

Spartina alterniflora GO

60.0

Spartina alterniflora GO

0.84

Spartina alterniflora GO

7.22

Spartina patens G

16.9

Spartina patens G

0.42

Spartina patens G

2.96

Distichlis spicata G

10.1

Distichlis spicata G

0.39

Salicornia spp.

2.76

Phragmites australis GI

3.8

Salicornia maritima A

0.28

Salicornia maritima A

2.61

Salicornia maritima A

2.8

Salicornia spp.

0.21

Distichlis spicata G

2.53

GATE

Spartina alterniflora GO

64.3

Spartina alterniflora GO

0.71

Spartina alterniflora GO

6.75

Spartina patens G

10.9

Spartina patens G

0.19

Spartina patens G

1.48

Distichlis spicata G

3.9

Distichlis spicata G

0.09

Suaeda spp. O

0.78

Iva frutescens

3.6

Iva frutescens

0.08

Distichlis spicata G

0.77

Toxicodendron radicans

2.2

Salicornia maritima A

0.08

Suaeda linearis AO

0.75

GEWA

Spartina cynosuroides GO

27.6

Amaranthus cannabinus O

0.68

Amaranthus cannabinus O

4.15

Spartina alterniflora GO

17.3

Spartina cynosuroides GO

0.54

Spartina cynosuroides GO

4.09

Amaranthus cannabinus O

15.5

Atriplex patula A

0.46

Spartina alterniflora GO

3.39

Kosteletzkya virginica O

8.3

Kosteletzkya virginica O

0.34

Atriplex patula A

2.52

Typha angustifolia OI

7.0

Spartina alterniflora GO

0.28

Kosteletzkya virginica O

2.12

SAHI

Spartina alterniflora GO

72.5

Spartina alterniflora GO

0.76

Spartina alterniflora GO

7.45

Distichlis spicata G

8.2

Distichlis spicata G

0.16

Distichlis spicata G

1.23

Spartina patens G

7.7

Spartina patens G

0.13

Spartina patens G

1.05

Suaeda spp. O

2.0

Limonium carolinianum O

0.10

Suaeda spp. O

0.94

Suaeda maritima O

1.8

Atriplex cristata

0.10

Lechea maritima

0.90

 

Appendix 2A. Salt marsh plant species list for Assateague Island National Seashore. Species labeled with .spp could not be identified beyond the genus level. Common names and symbols are derived from the USDA Plants database (plants.usda.gov).

Species

Common Name

Symbol

Andropogon virginicus

broomsedge bluestem

ANVI2

Aster spp.

Atriplex patula

spear saltbush

ATPA4

Baccharis halimifolia

eastern baccharis

BAHA

Carex spp.

Dichanthelium acuminatum var. fasciculatum

western panicgrass

DIACF

Distichlis spicata

saltgrass

DISP

Eleocharis spp.

Elymus virginicus

Virginia wildrye

ELVI3

Eragrostis spp.

Festuca rubra

red fescue

FERU2

Ilex opaca

American holly

ILOP

Iva frutescens

Jesuit's bark

IVFR

Juncus effusus

common rush

JUEF

Juncus gerardii

saltmeadow rush

JUGE

Juncus roemerianus

needlegrass rush

JURO

Limonium carolinianum

lavender thrift

LICA17

Lythrum lineare

wand lythrum

LYLI2

Mitchella repens

partridgeberry

MIRE

Morella cerifera

wax myrtle

MOCE2

Morella pensylvanica

northern bayberry

MOPE6

Panicum virgatum

switchgrass

PAVI2

Parthenocissus quinquefolia

Virginia creeper

PAQU2

Phytolacca americana

American pokeweed

PHAM4

Pinus rigida

pitch pine

PIRI

Pinus taeda

loblolly pine

PITA

Salicornia bigelovii

dwarf saltwort

SABI

Salicornia maritima

slender grasswort

SAMA11

Salicornia spp.

Samolus valerandi ssp. parviflorus

seaside brookweed

SAVAP

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus pungens

common threesquare

SCPU10

Schoenoplectus pungens var. pungens

common threesquare

SCPUP5

Schoenoplectus robustus

sturdy bulrush

SCRO5

Smilax rotundifolia

roundleaf greenbrier

SMRO

Solidago sempervirens

seaside goldenrod

SOSE

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Suaeda maritima

herbaceous seepweed

SUMA

Toxicodendron radicans

eastern poison ivy

TORA2

Vitis rotundifolia

muscadine

VIRO3

 

 

 

 

 

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCm1haW5mb250OiBUaW1lcyBOZXcgUm9tYW4NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRheGl6ZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShvZmZpY2VyKQ0KbGlicmFyeShleHRyYWZvbnQpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGxlbW9uKQ0KbGlicmFyeShtb25vY2hyb21lUikNCmxpYnJhcnkodmVnYW4pDQpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkNCnNvdXJjZShoZXJlOjpoZXJlKCJzdXBlcl9zcGxpdC5SIikpDQojZm9udF9pbXBvcnQocGF0dGVybiA9ICJ0aW1lcyIpDQojbG9hZGZvbnRzKGRldmljZSA9ICJ3aW4iKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSkNCg0KbG9hZChoZXJlOjpoZXJlKCJkYXRhIiwgImRlcml2ZWQiLCAidmVnX2NsZWFuZWQucmRhIikpDQpgYGANCg0KIyMjIyMgKipNZXRob2RzKioNCiMjIyMjICpTaXRlIERlc2NyaXB0aW9ucyoNCnwgICBBIHRvdGFsIG9mIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoVW5pcXVlSUQpKSAlPiUgcGx1Y2soMSlgIHNpdGVzIHdlcmUgbW9uaXRvcmVkIGF0IDYgcGFya3Mgd2l0aGluIHRoZSBOb3J0aGVhc3QgQ29hc3RhbCBhbmQgQmFycmllciBOZXR3b3JrLCBpbmNsdWRpbmcgQXNzYXRlYWd1ZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUgKEFTSVM7IE1hcnlsYW5kIGFuZCBWaXJnaW5pYSksIENvbG9uaWFsIE5hdGlvbmFsIEhpc3RvcmljYWwgUGFyayAoQ09MTzsgVmlyZ2luaWEpLCBGaXJlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSAoRklJUzsgTmV3IFlvcmspLCBHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSAoR0FURTsgTmV3IEplcnNleSBhbmQgTmV3IFlvcmspLCBHZW9yZ2UgV2FzaGluZ3RvbiBCaXJ0aHBsYWNlIE5hdGlvbmFsIE1vbnVtZW50IChHRVdBOyBWaXJnaW5pYSksIGFuZCBTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUgKFNBSEk7IE5ldyBZb3JrKSAoRmlndXJlIDEpLiBTYWx0IG1hcnNoIHZlZ2V0YXRpb24gY292ZXIgd2FzIG1vbml0b3JlZCBiZXR3ZWVuIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG1pbihhcy5udW1lcmljKFllYXJfY2hyKSkpICU+JSBwbHVjaygxKWAgdG8gYHIgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2UobWF4KGFzLm51bWVyaWMoWWVhcl9jaHIpKSkgJT4lIHBsdWNrKDEpYCwgYWx0aG91Z2ggbm90IGFsbCBzaXRlcyB3ZXJlIG1lYXN1cmVkIGluIGV2ZXJ5IHllYXIuIFNwZWNpZmljYWxseSwgc2l0ZSBHU0gxIGF0IEdBVEUgd2FzIHRoZSBvbmx5IHNpdGUgbWVhc3VyZWQgaW4gMjAxNCwgd2hlcmVhcyBhbGwgMyBzaXRlcyAoR1NIMSwgR1NIMiwgR1NIMykgd2VyZSBtZWFzdXJlZCBpbiAyMDEwLCAyMDEyLCAyMDE2LCBhbmQgMjAxOC4gU2ltaWxhcmx5LCBhdCBDT0xPLCBzaXRlcyBzaXRlcyBDMSwgQzUsIEM2LCBhbmQgQzggd2VyZSBtZWFzdXJlZCBpbiAyMDA4IGFuZCAyMDEwLCBidXQgc2l0ZXMgQzUsIEMxMywgQzE5LCBDMjMsIGFuZCBDMzAgd2VyZSBtZWFzdXJlZCBpbiAyMDEyLCAyMDE0IGFuZCAyMDE2LiBUaHVzLCBvbmx5IHNpdGUgQzUgd2FzIG1lYXN1cmVkIGNvbnNpc3RlbnRseSBhY3Jvc3MgYWxsIDUgc2FtcGxpbmcgeWVhcnMgKDIwMDgsIDIwMTAsIDIwMTIsIDIwMTQsIDIwMTYpIGF0IENPTE8uIEFkZGl0aW9uYWwgZGV0YWlscyBvZiB0aGUgbW9uaXRvcmluZyBzY2hlbWUgdXNlZCBhdCBlYWNoIHBhcmsgYXJlIHByZXNlbnRlZCBpbiBUYWJsZSAxLiAgICANCiZuYnNwOw0KDQohW0ZpZ3VyZS4xXSh2ZWdfbmVrdG9uX3NpdGVfbWFwLmpwZykNCiZuYnNwOw0KDQpgYGB7ciBzZXQgZmxleHRhYmxlIGFuZCBjb2xvciBkZWZhdWx0cywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnNldF9mbGV4dGFibGVfZGVmYXVsdHMoDQogIGZvbnQuc2l6ZSA9IDEyLA0KICBmb250LmZhbWlseSA9ICJ0aW1lcyBuZXcgcm9tYW4iLA0KICBwYWRkaW5nID0gMQ0KICApDQoNCnBhcmtfcGFsIDwtIGMoIiNlZjQ3NmYiLCAiI2Y3OGM2YiIsICIjZmZkMTY2IiwgIiMwYmQ1OWQiLCAiIzExOGFiMiIsICIjMDczYjRjIikNCmFzaXNfcGFsIDwtIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKCIjZWY0NzZmIiwgbW9kaWZpY2F0aW9uID0gImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA5KQ0KY29sb19wYWwgPC0gbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoIiNmNzhjNmIiLCBtb2RpZmljYXRpb24gPSAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDgpDQpmaWlzX3BhbCA8LSBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZSgiI2ZmZDE2NiIsIG1vZGlmaWNhdGlvbiA9ICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gOSkNCmdhdGVfcGFsIDwtIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKCIjMGJkNTlkIiwgbW9kaWZpY2F0aW9uID0gImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSAzKQ0KZ2V3YV9wYWwgPC0gIiMxMThhYjIiDQpzYWhpX3BhbCA8LSAiIzA3M2I0YyINCnNpdGVfcGFsIDwtIGMoYXNpc19wYWwsIGNvbG9fcGFsLCBmaWlzX3BhbCwgZ2F0ZV9wYWwsIGdld2FfcGFsLCBzYWhpX3BhbCkNCmBgYA0KDQpgYGB7ciBUYWJsZSAxLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uoc2l0ZV9jb3VudCA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgcGxvdF9jb3VudCA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBtaW5feWVhciA9IG1pbihhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBtYXhfeWVhciA9IG1heChhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBzYW1wbGVfZXZlbnRzID0gbl9kaXN0aW5jdChZZWFyX2NociksDQogICAgICAgICAgICB5ZWFyc19zYW1wbGVkID0gdG9TdHJpbmcodW5pcXVlKHNvcnQoWWVhcl9jaHIpKSksDQogICAgICAgICAgICBzaXRlcyA9IHRvU3RyaW5nKHVuaXF1ZShzb3J0KHN0cmlfZXh0cmFjdChVbmlxdWVJRCwgcmVnZXggPSAiKD88PV8pLioiKSkpKSkgJT4lIA0KICBtdXRhdGUoZnVsbF9wYXJrX25hbWUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIkFzc2F0ZWFndWUgSXNsYW5kIE5hdGlvbmFsIFNlYXNob3JlIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiLA0KICAgIFVuaXRDb2RlID09ICJTQUhJIiB+ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiDQogICksDQogICAgU3RhdGUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIk1ELCBWQSIsDQogICAgVW5pdENvZGUgPT0gIkNPTE8iIH4gIlZBIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiTlkiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJOSiwgTlkiLA0KICAgIFVuaXRDb2RlID09ICJHRVdBIiB+ICJWQSIsDQogICAgVW5pdENvZGUgPT0gIlNBSEkiIH4gIk5ZIg0KICAgICAgICApKSAlPiUNCmZsZXh0YWJsZSguLCBjb2xfa2V5cyA9IGMoImZ1bGxfcGFya19uYW1lIiwgIlVuaXRDb2RlIiwgIlN0YXRlIiwgInNpdGVfY291bnQiLCAic2l0ZXMiLCAicGxvdF9jb3VudCIsICJ5ZWFyc19zYW1wbGVkIiwgInNhbXBsZV9ldmVudHMiKSkgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiYWxsIikgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIHdpZHRoID0gMSwgbGF5b3V0ID0gImF1dG9maXQiKSAlPiUNCiAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKCJUYWJsZSAxLiBTaXRlIGNvdW50LCBwbG90IGNvdW50LCBtb25pdG9yaW5nIHllYXJzLCBhbmQgY291bnQgb2Ygc2FtcGxpbmcgZXZlbnRzIGF0IGVhY2ggcGFyay4iKSkgJT4lDQogIHNldF9oZWFkZXJfbGFiZWxzKC4sIGZ1bGxfcGFya19uYW1lID0gIlBhcmsgVW5pdCIsIFVuaXRDb2RlID0gIlVuaXQgQ29kZSIsIFN0YXRlID0gIkxvY2F0aW9uIiwgc2l0ZV9jb3VudCA9ICJOdW1iZXIgb2YgU2l0ZXMiLCBzaXRlcyA9ICJTaXRlIExpc3QiLCBwbG90X2NvdW50ID0gIk51bWJlciBvZiBQbG90cyIsIHllYXJzX3NhbXBsZWQgPSAiU2FtcGxlIFllYXJzIiwgc2FtcGxlX2V2ZW50cyA9ICJTYW1wbGluZyBFdmVudHMiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBib3JkZXJfaW5uZXJfaCguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwgcGFydCA9ICJib2R5IikgJT4lDQogIHBhZGRpbmcoLiwgcGFydCA9ICJib2R5IiwgcGFkZGluZy50b3AgPSAzLCBwYWRkaW5nLmJvdHRvbSA9IDMpIA0KYGBgDQojIyMjIyAqU2FtcGxpbmcgUHJvdG9jb2wqDQp8ICAgeCwgeSwgei4NCiZuYnNwOw0KDQojIyMjIyAqRGF0YSBBbmFseXNlcyoNCnwgICBJbiBtYW55IGluc3RhbmNlcywgdGhlIHRvdGFsIHBlcmNlbnQgY292ZXIgd2FzIHJlY29yZGVkIGFzIGFkZGluZyB0byBvdmVyIDEwMCUuIEluIG9yZGVyIHRvIHN0YW5kYXJkaXplIHRoZSBwZXJjZW50IGNvdmVyIHZhbHVlcyBiZXR3ZWVuIHBsb3RzLCB3ZSBjb252ZXJ0ZWQgdGhlIHBlcmNlbnQgY292ZXIgb2YgZWFjaCBzcGVjaWVzIHRvIHJlbGF0aXZlIHBlcmNlbnQgY292ZXIgYnkgZGl2aWRpbmcgdGhlIHBlcmNlbnQgY292ZXIgb2YgZWFjaCBzcGVjaWVzIGluIGEgcGxvdCBieSB0aGUgdG90YWwgcGxhbnQgY292ZXIgb2YgdGhlIGVudGlyZSBwbG90LiBUaGUgZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UgZm9yIGVhY2ggc3BlY2llcyB3YXMgY2FsY3VsYXRlZCBhcyB0aGUgcHJvcG9ydGlvbiBvZiBwbG90cyBhdCBhIHNpdGUgaW4gd2hpY2ggYSBzcGVjaWVzIHdhcyBmb3VuZC4gDQp8ICAgIFdlIGNvbXBhcmVkIHRoZSBzYWx0IG1hcnNoIHBsYW50IGNvbW11bml0eSBiZXR3ZWVuIGFuZCB3aXRoaW4gdGhlIDYgcGFyayB1bml0cyB1c2luZyB0aGUgZm9sbG93aW5nIG1ldHJpY3M6IGF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciwgYXZlcmFnZSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MsIG1heGltdW0gcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzLCB0b3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MsIG51bWJlciBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmssIFNoYW5ub24ncyBkaXZlcnNpdHkgaW5kZXgsIGFuZCBJbnZlcnNlIFNpbXBzb24ncyBkaXZlcnNpdHkgaW5kZXguIEF2ZXJhZ2UgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHNwZWNpZXMgcmVjb3JkZWQgaW4gZWFjaCBwbG90LiBNYXhpbXVtIHBsb3QtbGV2ZWwgc3BlY2llcyByaWNobmVzcyB3YXMgZGVyaXZlZCBmcm9tIHRoZSBwbG90IHdpdGggdGhlIGhpZ2hlc3Qgc3BlY2llcyByaWNobmVzcyBmb3VuZCBhbW9uZyBhbGwgcGxvdHMgYXQgZWFjaCBwYXJrLiBUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3Mgd2FzIGNhbGN1bGF0ZWQgYXMgdGhlIHRvdGFsIG51bWJlciBvZiBkaXN0aW5jdCBzcGVjaWVzIGZvdW5kIGFjcm9zcyBhbGwgcGxvdHMgYXQgZWFjaCBwYXJrLiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBzcGVjaWVzIGF0IGVhY2ggcGFyayByZXByZXNlbnRzIHRoZSBjb3VudCBvZiBzcGVjaWVzIGF0IGEgcGFyayB0aGF0IHdlcmUgbm90IGZvdW5kIGF0IHRoZSBvdGhlciA1IHBhcmtzLiBTaGFubm9uJ3MgRGl2ZXJzaXR5IEluZGV4IHJhbmdlcyBmcm9tIDAgdG8gaW5maW5pdHksIHdpdGggbG93ZXIgdmFsdWVzIHJlcHJlc2VudGluZyBsb3dlciBkaXZlcnNpdHkuIFRoZSBTaGFubm9uIGluZGV4IGlzIGFuIGluZm9ybWF0aW9uIHN0YXRpc3RpYyBpbmRleCwgd2hpY2ggbWVhbnMgaXQgYXNzdW1lcyBhbGwgc3BlY2llcyBhcmUgcmVwcmVzZW50ZWQgaW4gYSBzYW1wbGUgYW5kIHRoYXQgdGhleSBhcmUgcmFuZG9tbHkgc2FtcGxlZC4gU2ltcHNvbidzIERpdmVyc2l0eSBJbmRleCByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggMCByZXByZXNlbnRpbmcgaW5maW5pdGUgZGl2ZXJzaXR5IGFuZCAxIHJlcHJlc2VudGluZyBubyBkaXZlcnNpdHkuIFRoZSBTaW1wc29uIGluZGV4IGlzIGEgZG9taW5hbmNlIGluZGV4IGJlY2F1c2UgaXQgZ2l2ZXMgbW9yZSB3ZWlnaHQgdG8gY29tbW9uIG9yIGRvbWluYW50IHNwZWNpZXMuIENvbnZlcnNlbHksIHRoZSBJbnZlcnNlIFNpbXBzb24gSW5kZXgsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIGludmVyc2Ugb2YgdGhlIFNpbXBzb24gSW5kZXggKDEvRCksIHJhbmdlcyBmcm9tIDEgdG8gaW5maW5pdHksIHdpdGggbG93ZXIgdmFsdWVzIHJlcHJlc2VudGluZyBsb3dlciBkaXZlcnNpdHkuDQp8ICAgV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBhbmQgdGhlIG51bWJlciBvZiB1bmlxdWUgc3BlY2llcyBhdCBlYWNoIHBhcmssIHdlIGZpcnN0IGNhbGN1bGF0ZWQgdGhlIHZhbHVlIG9mIGVhY2ggbWV0cmljIGZvciBlYWNoIHBsb3Qgd2l0aGluIGVhY2ggc2l0ZSBmb3IgZWFjaCB5ZWFyLCBhbmQgdGhlbiBhdmVyYWdlZCB0aGVzZSBwbG90LWxldmVsIHZhbHVlcyB1cCB0byB0aGUgc2l0ZS1sZXZlbCBmb3IgZWFjaCB5ZWFyLiBDb21wYXJpc29ucyBiZXR3ZWVuIHBhcmtzIGFyZSBwcmVzZW50ZWQgYXMgYmFyIGdyYXBocyBvZiBwYXJrLWxldmVsIGF2ZXJhZ2VzIHdpdGggdGhlIHBhcmsgdW5pdCBvbiB0aGUgeC1heGlzIGFuZCByZXNwZWN0aXZlIG1ldHJpYyBvbiB0aGUgeS1heGlzLiBDb21wYXJpc29ucyBvdmVyIHRpbWUgd2l0aGluIGVhY2ggcGFyayBhcmUgcHJlc2VudGVkIGFzIGxpbmUgZ3JhcGhzIHdpdGggdGhlIHNhbXBsZSB5ZWFycyBvbiB0aGUgeC1heGlzIGFuZCB0aGUgcmVzcGVjdGl2ZSBtZXRyaWMgb24gdGhlIHktYXhpcywgd2l0aCBzZXBhcmF0ZSBwYW5lbHMgZm9yIGVhY2ggcGFyayB1bml0LiBFcnJvciB2YWx1ZXMgYW5kIGVycm9yIGJhcnMgcmVwcmVzZW50IHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2l0ZS1sZXZlbCB5ZWFybHkgdmFsdWVzLiANCiZuYnNwOw0KDQojIyMjIyAqKlJlc3VsdHMqKg0KIyMjIyMgKlRvdGFsIENvdmVyKg0KYGBge3IgVG90YWwgQ292ZXIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0b3RhbF9jb3ZlciA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICBncm91cF9ieShFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5feWVhcl9wbG90X3RvdGFsX2NvdmVyID0gbWVhbih0b3RhbF9wZXJjZW50X2NvdmVyLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIHN1bW1hcmlzZShtZWFuX3llYXJfc2l0ZV90b3RhbF9jb3ZlciA9IG1lYW4obWVhbl95ZWFyX3Bsb3RfdG90YWxfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5feWVhcl90b3RhbF9jb3ZlciA9IG1lYW4obWVhbl95ZWFyX3NpdGVfdG90YWxfY292ZXIsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBzZV95ZWFyX3RvdGFsX2NvdmVyID0gc2QobWVhbl95ZWFyX3NpdGVfdG90YWxfY292ZXIpL3NxcnQobGVuZ3RoKG1lYW5feWVhcl9zaXRlX3RvdGFsX2NvdmVyKSkpDQpgYGANCg0KfCAgIEF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciBkZWNyZWFzZWQgb3ZlciB0aGUgc3R1ZHkgcGVyaW9kIGF0IGFsbCBwYXJrcywgYWx0aG91Z2ggdGhlIGRlY3JlYXNlIGluIHRvdGFsIGNvdmVyIHdhcyBtb3JlIHByb25vdW5jZWQgYXQgc29tZSBwYXJrcyB0aGFuIG90aGVycyAoRmlndXJlIDIpLiBGb3IgZXhhbXBsZSBhdCBGSUlTLCBHRVdBLCBhbmQgU0FISSwgdG90YWwgcGxvdCBjb3ZlciBkZWNsaW5lZCBzdWJzdGFudGlhbGx5IGJldHdlZW4gdGhlIGZpcnN0IHNhbXBsaW5nIGV2ZW50IHRvIHRoZSBsYXN0IHNhbXBsaW5nIGV2ZW50IGFuZCBzaG93ZWQgbm8gc2lnbnMgb2YgcmVjb3ZlcnkgKEZpZ3VyZSAyYywgMmUsIGFuZCAyZikuIEFsdGVybmF0aXZlbHksIHRvdGFsIHBsb3QgY292ZXIgYXQgQVNJUywgQ09MTywgYW5kIEdBVEUgZGVjbGluZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHVkeSBwZXJpb2QgYW5kIGFwcGVhcmVkIHRvIHJlYWNoIGEgbG93IGluIDIwMTQsIDIwMTIsIGFuZCAyMDE2IChyZXNwZWN0aXZlbHkpLCBidXQgdGhlbiBhcHBlYXJlZCB0byByZWNvdmVyIGR1cmluZyB0aGUgZm9sbG93aW5nIHNhbXBsaW5nIGV2ZW50cyAoRmlndXJlIDJhIDJiLCBhbmQgMmQpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSAyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dkcmF3KHRvdGFsX2NvdmVyICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5feWVhcl90b3RhbF9jb3ZlciwgY29sb3IgPSBVbml0Q29kZSkpICsNCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl95ZWFyX3RvdGFsX2NvdmVyIC0gc2VfeWVhcl90b3RhbF9jb3ZlciwgeW1heCA9IG1lYW5feWVhcl90b3RhbF9jb3ZlciArIHNlX3llYXJfdG90YWxfY292ZXIpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IFVuaXRDb2RlKSwgc2hvdy5sZWdlbmQgPSBGLCBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyKSArDQogIGdlb21fdGV4dChkYXRhID0gLiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdChVbml0Q29kZSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShsZXR0ZXIgPSBwYXN0ZTAoIigiLExFVFRFUlNbMTpuKCldLCAiKSIpLA0KICAgICAgICAgICAgICAgICAgICAgZiA9IHBtYXBfY2hyKGxpc3QobGV0dGVyLCBVbml0Q29kZSksIGZ1bmN0aW9uKGEsIGIpIGRlcGFyc2UoYnF1b3RlKGJvbGQoLihhKX5wbGFpbiguKGIpKSkpKSkpLA0KICAgIGFlcyh4ID0gc3RydWN0dXJlKC1JbmYsIGNsYXNzID0gIkRhdGUiKSwgeSA9ICBJbmYsIGxhYmVsID0gZiksDQogICAgICAgICAgICBoanVzdCA9IC0wLjIsIHZqdXN0ID0gMiwgc2l6ZSAgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiLCBmYW1pbHkgPSAic2VyaWYiLCBwYXJzZSA9IFQsIGluaGVyaXQuYWVzID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGFya19wYWwpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFya19wYWwpICsNCiAgbGVtb246OmZhY2V0X3JlcF93cmFwKH5Vbml0Q29kZSwgc2NhbGVzID0gImZyZWVfeCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxNjApLCBuYW1lID0gIkF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgc2NhbGVfeF9kYXRlKGV4cGFuZCA9IGMoLjA0LCAwKSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpLCBkYXRlX2xhYmVscyA9ICInJXkiKSArDQogIGxhYnMoY2FwdGlvbiA9IGJxdW90ZShib2xkKCJGaWd1cmUgMi4iKX4iQXZlcmFnZSB0b3RhbCBwbG90IGNvdmVyIGF0IGVhY2ggcGFyay4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gLTAuMSwgY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KICApKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSAyLiIpfiJBdmVyYWdlIHRvdGFsIHBsb3QgY292ZXIgKCUpIGF0IGVhY2ggcGFyay4iKSwgZm9udGZhbWlseSA9ICJzZXJpZiIsIHggPSAwLjAyLCB5ID0gMC4wNCwgc2l6ZSA9IDEyLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqU3BlY2llcyBSaWNobmVzcyoNCmBgYHtyIFNwZWNpZXMgcmljaG5lc3MsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KIyBwbG90X2xldmVsIHNwZWNpZXMgcmljaG5lc3MNCnBsb3Rfc3BlY2llc19yaWNobmVzcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICBncm91cF9ieShFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKHNwZWNpZXNfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lDQogIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWVhbihzcGVjaWVzX2NvdW50LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWF4X3llYXJfc2l0ZV9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBtYXgoc3BlY2llc19jb3VudCkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9IG1lYW4obWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWF4KG1heF95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSwNCiAgICAgICAgICAgIHNlX3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gc2QobWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzKS9zcXJ0KGxlbmd0aChtZWFuX3llYXJfc2l0ZV9wbG90X3NwZWNpZXNfcmljaG5lc3MpKSkgDQogIA0KIyBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZm9yIGVhY2ggeWVhciBhY3Jvc3MgYWxsIHllYXJzDQpwYXJrX3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIHN1bW1hcmlzZShwbG90X251bSA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBzaXRlX251bSA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgdG90YWxfcmljaG5lc3MgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KIyBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgYWNyb3NzIGFsbCB5ZWFycw0KcGFya19zcGVjaWVzX3JpY2huZXNzX2FsbF95cnMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpLA0KICAgICAgICAgICAgc2l0ZV9udW0gPSBuX2Rpc3RpbmN0KFVuaXF1ZUlEKSwNCiAgICAgICAgICAgIHRvdGFsX3JpY2huZXNzID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpIA0KDQojIHVuaXF1ZSBzcGVjaWVzIGZvdW5kIGluIGVhY2ggcGFyayAoaS5lLiwgc3BlY2llcyBub3QgZm91bmQgaW4gYW55IG90aGVyIHBhcmtzKQ0KcGFya191bmlxdWVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZ3JvdXBfYnkoU2NpTmFtZV9jb3IpICU+JQ0KICByZWZyYW1lKHBhcmtzID0gYXMubGlzdCh1bmlxdWUoVW5pdENvZGUpKSkgJT4lDQogIGdyb3VwX2J5KFNjaU5hbWVfY29yKSAlPiUNCiAgbXV0YXRlKHBhcmtfY291bnQgPSBsZW5ndGgocGFya3MpKSAlPiUNCiAgZmlsdGVyKHBhcmtfY291bnQgPT0gMSkgJT4lDQogIHVubmVzdChwYXJrcykgJT4lDQogIHNlbGVjdCgiVW5pdENvZGUiID0gcGFya3MsIFNjaU5hbWVfY29yLCBwYXJrX2NvdW50KQ0KICANCiMgY291bnQgb2YgdW5pcXVlIHNwZWNpZXMgZm91bmQgaW4gZWFjaCBwYXJrICANCnBhcmtfdW5pcXVlX3NwZWNpZXNfY291bnQgPC0gcGFya191bmlxdWVfc3BlY2llcyAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uobl91bmlxdWUgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KIyBjb3VudCBvZiB1bmlxdWUgc3BlY2llcyBwZXIgeWVhcg0KcGFya191bmlxdWVfc3BlY2llc19jb3VudF9wZXJfeWVhciA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGxlZnRfam9pbiguLCBwYXJrX3VuaXF1ZV9zcGVjaWVzLCBieSA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBhcmtfY291bnQpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG5fdW5pcXVlID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpDQoNCnNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyA8LSBsaXN0KA0KICAidG90YWxfdW5pcXVlX3NwZWNpZXMiID0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JSANCiAgICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JSAgDQogICAgcHVsbCgpICU+JSANCiAgICBhcy5udW1lcmljKCksDQogICJtaW5fcmljaG5lc3MiID0gcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSANCiAgICBtdXRhdGUobSA9IHJvdW5kKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIDEpKSAlPiUgcHVsbChtKSwNCiAgIm1heF9yaWNobmVzcyIgPSBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSANCiAgICBtdXRhdGUobSA9IHJvdW5kKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIDEpKSAlPiUgDQogICAgcHVsbChtKSwNCiAgIm1heF9yaWNobmVzc19kZiIgPSBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIA0KICAgIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcykgJT4lDQogICAgbXV0YXRlKFllYXJfY2hyID0gcGFzdGUwKCJhXyIsIFllYXJfY2hyKSkgJT4lDQogICAgc3VwZXJfc3BsaXQoVW5pdENvZGUsIFllYXJfY2hyKSwNCiAgInBhcmtfcmljaG5lc3NfZGYiID0gcGFya19zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgDQogICAgc2VsZWN0KFVuaXRDb2RlLCBZZWFyX2NociwgdG90YWxfcmljaG5lc3MpICU+JQ0KICAgIG11dGF0ZShZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NocikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NociksDQogICJ1bmlxdWVfc3BlY2llc19kZiIgPSBwYXJrX3VuaXF1ZV9zcGVjaWVzX2NvdW50X3Blcl95ZWFyICU+JQ0KICAgIG11dGF0ZShZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NocikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NocikNCikNCmBgYA0KDQp8ICAgSW4gdG90YWwsIHdlIGlkZW50aWZpZWQgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHRvdGFsX3VuaXF1ZV9zcGVjaWVzYCB1bmlxdWUgcGxhbnQgc3BlY2llcyB3aXRoaW4gdGhlIHNhbHQgbWFyc2hlcyBhdCBhbGwgNiBwYXJrcy4gQXZlcmFnZSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgdmFyaWVkIGxpdHRsZSBmcm9tIHllYXIgdG8geWVhciBhdCBhbGwgcGFya3MgdGhyb3VnaG91dCB0aGUgc3R1ZHkgcGVyaW9kIChyYW5nZTogYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1pbl9yaWNobmVzc2AgdG8gYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1heF9yaWNobmVzc2Agc3BlY2llcyBwZXIgcGxvdCkgKEZpZ3VyZSAzKS4gTWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjcmVhc2VkIGFjcm9zcyB0aGUgZW50aXJlIHN0dWR5IHBlcmlvZCBhdCBhbGwgcGFya3MgZXhjZXB0IENPTE8gYW5kIEdBVEUgKEZpZ3VyZSAzKS4gQXQgQ09MTywgbWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjbGluZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJENPTE8kYV8yMDA4JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAwOCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJENPTE8kYV8yMDEyJG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxMiwgYnV0IHRoZW4gaW5jcmVhc2VkIGJhY2sgdG8gYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1heF9yaWNobmVzc19kZiRDT0xPJGFfMjAxNiRtYXhfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3NgIGluIDIwMTYgKEZpZ3VyZSAzYikuIEF0IEdBVEUsIG1heGltdW0gcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGRvdWJsZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEdBVEUkYV8yMDE0JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxNCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEdBVEUkYV8yMDE4JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxOCAoRmlndXJlIDNkKS4gTm90YWJseSwgbWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgYXQgRklJUyBpbmNyZWFzZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEZJSVMkYV8yMDA5JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAwOSB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEZJSVMkYV8yMDE1JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxNSBiZWZvcmUgZGVjcmVhc2luZyBzdWJzdGFudGlhbGx5IHRvIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyRtYXhfcmljaG5lc3NfZGYkRklJUyRhXzIwMTckbWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzYCBpbiAyMDE3IChGaWd1cmUgM2MpLiBUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjcmVhc2VkIGFjcm9zcyB0aGUgZW50aXJlIHN0dWR5IHBlcmlvZCBhdCBhbGwgcGFya3MgZXhjZXB0IENPTE8gYW5kIEdBVEUgKEZpZ3VyZSA0KS4gTm90YWJseSwgdG90YWwgcGFyay1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGRlY2xpbmVkIGRyYW1hdGljYWxseSBhdCBib3RoIEFTSVMgYW5kIEdFV0EuIEF0IEFTSVMsIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBkZWNsaW5lZCBmcm9tIGEgaGlnaCBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRBU0lTJGFfMjAxMCR0b3RhbF9yaWNobmVzc2AgaW4gMjAxMCB0byBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRBU0lTJGFfMjAxMiR0b3RhbF9yaWNobmVzc2AgaW4gMjAxMiAoRmlndXJlIDRhKS4gU2ltaWxhcmx5LCBhdCBHRVdBLCB0b3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjbGluZWQgZnJvbSBhIGhpZ2ggb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0VXQSRhXzIwMDgkdG90YWxfcmljaG5lc3NgIGluIDIwMDggdG8gYSBsb3cgb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0VXQSRhXzIwMTAkdG90YWxfcmljaG5lc3NgIGluIDIwMTAgKEZpZ3VyZSA0ZSkuIENvbnZlcnNlbHksIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBpbmNyZWFzZWQgZnJvbSBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRDT0xPJGFfMjAwOCR0b3RhbF9yaWNobmVzc2AgaW4gMjAwOCB0byBhIGhpZ2ggb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkQ09MTyRhXzIwMTYkdG90YWxfcmljaG5lc3NgIGluIDIwMTYgYXQgQ09MTyAoRmlndXJlIDVjKSwgYW5kIGFsc28gaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0FURSRhXzIwMTQkdG90YWxfcmljaG5lc3NgIGluIDIwMTQgdG8gYSBoaWdoIG9mIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyRwYXJrX3JpY2huZXNzX2RmJEdBVEUkYV8yMDE4JHRvdGFsX3JpY2huZXNzYCBpbiAyMDE4IGF0IEdBVEUgKEZpZ3VyZSA0ZCkuIEZpbmFsbHksIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gZWFjaCBwYXJrIGRlY3JlYXNlZCBhY3Jvc3MgdGhlIGVudGlyZSBzdHVkeSBwZXJpb2QgYXQgYWxsIHBhcmtzIGV4Y2VwdCBDT0xPIGFuZCBHQVRFIChGaWd1cmUgNCkuIEF0IENPTE8sIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gdGhlIHBhcmsgZG91YmxlZCBmcm9tIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR1bmlxdWVfc3BlY2llc19kZiRDT0xPJGFfMjAwOCRuX3VuaXF1ZWAgaW4gMjAwOCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkdW5pcXVlX3NwZWNpZXNfZGYkQ09MTyRhXzIwMTYkbl91bmlxdWVgIGluIDIwMTYgKEZpZ3VyZSA0YikuIEF0IEdBVEUsIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gdGhlIHBhcmsgaW5jcmVhc2VkIHN1YnN0YW50aWFsbHkgZnJvbSBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkdW5pcXVlX3NwZWNpZXNfZGYkR0FURSRhXzIwMTQkbl91bmlxdWVgIGluIDIwMTQgdG8gYSBoaWdoIG9mIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR1bmlxdWVfc3BlY2llc19kZiRHQVRFJGFfMjAxOCRuX3VuaXF1ZWAgaW4gMjAxOCAoRmlndXJlIDRkKS4NCiZuYnNwOw0KDQpgYGB7ciBGaWd1cmUgMywgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwPSAiRmlndXJlIDMuIC4uLiIgfQ0KZ2dkcmF3KHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSBjKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcyksIG5hbWVzX3RvID0gInJpY2huZXNzX21ldHJpYyIsIHZhbHVlc190byA9ICJyaWNobmVzcyIpICU+JQ0KICBtdXRhdGUoc2VfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBpZl9lbHNlKHJpY2huZXNzX21ldHJpYyA9PSAibWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiwgTkEsIHNlX3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSkgJT4lDQogIG11dGF0ZShZZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFllYXIsIHkgPSByaWNobmVzcywgY29sb3IgPSBVbml0Q29kZSwgZmlsbCA9IFVuaXRDb2RlLCBncm91cCA9IHJpY2huZXNzX21ldHJpYykpICsNCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcmljaG5lc3MgLSBzZV95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgeW1heCA9IHJpY2huZXNzICsgc2VfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSByaWNobmVzc19tZXRyaWMpLCBzaG93LmxlZ2VuZCA9IFQsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIyLCAyNCksIGJyZWFrcyA9IGMoIm1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MiLCAibWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiksIGxhYmVscyA9IGMoIkF2ZXJhZ2UgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzICAgIiwgIk1heCBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MiKSkgKw0KICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCBzY2FsZXMgPSAiZnJlZV94IiwgcmVwZWF0LnRpY2subGFiZWxzID0gRikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDExKSwgbmFtZSA9ICJQbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKG4pIiwgbGFiZWxzID0gZnVuY3Rpb24oeCkgc3ByaW50ZigiJTAuMGYiLCB4KSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLCBmaWxsID0gIm5vbmUiKSArDQogIGxhYnMoY2FwdGlvbiA9IGJxdW90ZShib2xkKCJGaWd1cmUgMy4iKX4iQXZlcmFnZSAoc3F1YXJlIHBvaW50cykgYW5kIG1heGltdW0gKHRyaWFuZ2xlIHBvaW50cykgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGF0IGVhY2ggcGFyay4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxMCwgdW5pdCA9ICJwdCIpKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAtMC4yLCBjb2xvciA9ICJ0cmFuc3BhcmVudCIpDQogICkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDMuIil+IkF2ZXJhZ2UgKHNxdWFyZSBwb2ludHMpIGFuZCBtYXhpbXVtICh0cmlhbmdsZSBwb2ludHMpIHBsb3QtbGV2ZWwgc3BlY2llcyByaWNobmVzcyBhdCBlYWNoIHBhcmsuIiksIHggPSAwLjAyLCB5ID0gMC4wNCwgZm9udGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmNhcD0gIkZpZ3VyZSA0LiAuLi4iIH0NCmdnZHJhdyhwYXJrX3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGFya191bmlxdWVfc3BlY2llc19jb3VudF9wZXJfeWVhciwgYnkgPSBjKCJVbml0Q29kZSIsICJZZWFyX2NociIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSBjKHRvdGFsX3JpY2huZXNzLCBuX3VuaXF1ZSksIG5hbWVzX3RvID0gInJpY2huZXNzX21ldHJpYyIsIHZhbHVlc190byA9ICJyaWNobmVzcyIpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgcmljaG5lc3MgPSBpZl9lbHNlKGlzLm5hKHJpY2huZXNzKSwgMCwgcmljaG5lc3MpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBZZWFyLCB5ID0gcmljaG5lc3MsIGNvbG9yID0gVW5pdENvZGUsIGZpbGwgPSBVbml0Q29kZSwgZ3JvdXAgPSByaWNobmVzc19tZXRyaWMpKSArDQogIGdlb21fbGluZShzaG93LmxlZ2VuZCA9IEYpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSByaWNobmVzc19tZXRyaWMpLCBzaG93LmxlZ2VuZCA9IFQsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxLCAyMyksIGJyZWFrcyA9IGMoInRvdGFsX3JpY2huZXNzIiwgIm5fdW5pcXVlIiksIGxhYmVscyA9IGMoIlRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAgICIsICJVbmlxdWUgc3BlY2llcyBjb3VudCIpKSArDQogIGxlbW9uOjpmYWNldF9yZXBfd3JhcCh+VW5pdENvZGUsIHNjYWxlcyA9ICJmcmVlX3giLCByZXBlYXQudGljay5sYWJlbHMgPSBGKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNDUpLCBuYW1lID0gIlBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAobikiLCBsYWJlbHMgPSBmdW5jdGlvbih4KSBzcHJpbnRmKCIlMC4wZiIsIHgpLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIicleSIsIHNlYy5heGlzID0gZHVwX2F4aXMoKSkgKw0KICBndWlkZXMoY29sb3IgPSAibm9uZSIsIGZpbGwgPSAibm9uZSIpICsNCiAgbGFicyhjYXB0aW9uID0gYnF1b3RlKGJvbGQoIkZpZ3VyZSA0LiIpfiJQYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKGNpcmNsZSBwb2ludHMpIGFuZCBjb3VudCBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmsgKGRpYW1vbmQgcG9pbnRzKS4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxMCwgdW5pdCA9ICJwdCIpKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLCBjb2xvciA9ICJ0cmFuc3BhcmVudCIpDQogICksDQogIHlsaW0gPSBjKC0wLjA1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA0LiIpfiJUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKGNpcmNsZSBwb2ludHMpIGFuZCBjb3VudCBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmsgKGRpYW1vbmQiKSwgeCA9IDAuMDIsIHkgPSAwLjAzLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpICsNCiAgZHJhd19sYWJlbChicXVvdGUocGxhaW4oInBvaW50cykuIikpLCB4ID0gMC4wMiwgeSA9IC0wLjAyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqUmFyZSwgVGhyZWF0ZW5lZCAmIEVuZGFuZ2VyZWQgU3BlY2llcyoNCmBgYHtyIFJhcmUgc3BlY2llcywgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpwYXJrX3JhcmVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IsIHN0YXJ0c193aXRoKCJyYXJlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX3JhcmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJyYXJlXyIpLCB+IC54ID09ICJUIikgfiAiVCIpKSAlPiUNCiAgZmlsdGVyKGlzX3JhcmUgPT0gIlQiKQ0KYGBgDQoNCnwgICBPbmx5IGByIGxlbmd0aChwYXJrX3JhcmVfc3BlY2llcylgIHJhcmUgc3BlY2llcyAtICpgciBwYXJrX3JhcmVfc3BlY2llcyAlPiUgc3VtbWFyaXNlKG0gPSB1bmlxdWUoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbCgpYCogLSB3YXMgaWRlbnRpZmllZC4gKmByIHBhcmtfcmFyZV9zcGVjaWVzICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiKSAlPiUgc3VtbWFyaXNlKG0gPSB1bmlxdWUoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbCgpYCogaXMgY29uc2lkZXJlZCByYXJlIGJ5IHRoZSBzdGF0ZSBvZiBOZXcgSmVyc2V5IGFuZCB3YXMgb25seSBmb3VuZCBpbiBvbmUgcGxvdCBhdCBHQVRFIGluIDIwMTcuIE5vIGZlZGVyYWxseSBsaXN0ZWQgdGhyZWF0ZW5lZCBvciBlbmRhbmdlcmVkIHNwZWNpZXMgd2VyZSBmb3VuZCBhdCBhbnkgb2YgdGhlIHBhcmtzLg0KJm5ic3A7DQoNCiMjIyMjICpJbnZhc2l2ZSwgTm94aW91cyAmIFByb2hpYml0ZWQgU3BlY2llcyoNCmBgYHtyIEludmFzaXZlIHNwZWNpZXMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KcGFya19pbnZhc2l2ZV9zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBVbmlxdWVJRCwgRXZlbnRJRCwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3Zlciwgc3RhcnRzX3dpdGgoImludmFzaXZlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX2ludmFzaXZlID0gY2FzZV93aGVuKGlmX2FueShzdGFydHNfd2l0aCgiaW52YXNpdmVfIiksIH4gLnggPT0gIlQiKSB+ICJUIikpICU+JQ0KICBmaWx0ZXIoaXNfaW52YXNpdmUgPT0gIlQiKQ0KDQppbnZhc2l2ZV9yZXN1bHRzIDwtIGxpc3QoDQogICJ0b3RhbF9pbnZhc2l2ZV9zcGVjaWVzIiA9IHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICAgIHB1bGwoKSAlPiUNCiAgICBhcy5udW1lcmljKCksDQogICJjb3VudF9kZiIgPSBwYXJrX2ludmFzaXZlX3NwZWNpZXMgJT4lDQogICAgc2VsZWN0KFVuaXRDb2RlLCBTY2lOYW1lX2NvcikgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICAgIHN1bW1hcmlzZShzcGVjaWVzX2NvdW50ID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICAgIHNwbGl0KC4kVW5pdENvZGUpLA0KICAic3BlY2llc19uYW1lc19kZiIgPQ0KICAgIHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgICBzZWxlY3QoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogICAgZGlzdGluY3QoKSAlPiUNCiAgICBhcnJhbmdlKFNjaU5hbWVfY29yKSAlPiUNCiAgICBzcGxpdCguJFVuaXRDb2RlKSwNCiAgInNwZWNpZXNfeWVhcl9kZiIgPSBwYXJrX2ludmFzaXZlX3NwZWNpZXMgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lIA0KICAgIHN1bW1hcmlzZShtZWFuX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpICU+JSANCiAgICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JSANCiAgICBtdXRhdGUobl95ZWFycyA9IG5fZGlzdGluY3QoWWVhcl9jaHIpKSAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBtdXRhdGUoWWVhciA9IGFzLmludGVnZXIoWWVhcl9jaHIpKSAlPiUgDQogICAgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLDApLA0KICAgICAgICAgICBZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NociksDQogICAgICAgICAgIFNjaU5hbWVfY29yID0gamFuaXRvcjo6bWFrZV9jbGVhbl9uYW1lcyhTY2lOYW1lX2NvcikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpLA0KICAic2luZ2xlX3llYXIiID0gcGFya19pbnZhc2l2ZV9zcGVjaWVzICU+JQ0KICAgIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JSANCiAgICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKSAlPiUgDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUgDQogICAgbXV0YXRlKG5feWVhcnMgPSBuX2Rpc3RpbmN0KFllYXJfY2hyKSkgJT4lDQogICAgZmlsdGVyKG5feWVhcnMgPT0gMSkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICAgIGRpc3RpbmN0KCkgJT4lDQogICAgc3BsaXQoLiRVbml0Q29kZSkNCikNCmBgYA0KDQp8ICAgT2YgdGhlIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR0b3RhbF91bmlxdWVfc3BlY2llc2AgdW5pcXVlIHNwZWNpZXMgaWRlbnRpZmllZCBhY3Jvc3MgYWxsIHBhcmtzLCBgciBpbnZhc2l2ZV9yZXN1bHRzJHRvdGFsX2ludmFzaXZlX3NwZWNpZXNgIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSwgbm94aW91cywgb3IgcHJvaGliaXRlZCB3aXRoaW4gdGhlaXIgcmVzcGVjdGl2ZSBzdGF0ZXMuIE5vIGludmFzaXZlIHNwZWNpZXMgd2VyZSBmb3VuZCBpbiBBU0lTLCBHRVdBLCBvciBTQUhJLiBBdCBDT0xPLCBvbmx5IGByIGludmFzaXZlX3Jlc3VsdHMkY291bnRfZGYkQ09MTyRzcGVjaWVzX2NvdW50YCBzcGVjaWVzIC0gKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRDT0xPJFNjaU5hbWVfY29yYCogLSB3YXMgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgVmlyZ2luaWEgRGVwYXJ0bWVudCBvZiBDb25zZXJ2YXRpb24gYW5kIFJlY3JlYXRpb24gKDxodHRwczovL3d3dy5kY3IudmlyZ2luaWEuZ292L25hdHVyYWwtaGVyaXRhZ2UvaW52c3BwZGZsaXN0PikuIEF0IEZJSVMsIGByIGludmFzaXZlX3Jlc3VsdHMkY291bnRfZGYkRklJUyRzcGVjaWVzX2NvdW50YCBzcGVjaWVzLCBpbmNsdWRpbmcgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRGSUlTJFNjaU5hbWVfY29yWzFdYCosICpgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfbmFtZXNfZGYkRklJUyRTY2lOYW1lX2NvclsyXWAqLCBhbmQgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRGSUlTJFNjaU5hbWVfY29yWzNdYCosIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgc3RhdGUgb2YgTmV3IFlvcmsgKFN0YXRlIG9mIE5ldyBZb3JrLCAyMDIyKS4gQXQgR0FURSwgYHIgaW52YXNpdmVfcmVzdWx0cyRjb3VudF9kZiRHQVRFJHNwZWNpZXNfY291bnRgIHNwZWNpZXMsIGluY2x1ZGluZyAqYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX25hbWVzX2RmJEdBVEUkU2NpTmFtZV9jb3JbMV1gKiwgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRHQVRFJFNjaU5hbWVfY29yWzJdYCosICpgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfbmFtZXNfZGYkR0FURSRTY2lOYW1lX2NvclszXWAqLCBhbmQgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRHQVRFJFNjaU5hbWVfY29yWzRdYCogd2VyZSBjb25zaWRlcmVkIGludmFzaXZlIGJ5IHRoZSBzdGF0ZSBvZiBOZXcgWW9yayAoU3RhdGUgb2YgTmV3IFlvcmssIDIwMjIpLiBOb3RhYmx5LCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIHdhcyBmb3VuZCBpbiBtdWx0aXBsZSB5ZWFycyBhdCBib3RoIEZJSVMgYW5kIEdBVEUgKEZpZ3VyZSA1YikuIE9mIHRoZSBgciBpbnZhc2l2ZV9yZXN1bHRzJHRvdGFsX2ludmFzaXZlX3NwZWNpZXNgIGludmFzaXZlIHNwZWNpZXMgZm91bmQsIGByIHN1bShtYXBfZGJsKGludmFzaXZlX3Jlc3VsdHMkc2luZ2xlX3llYXIsIH5ucm93KC54KSkpYCBzcGVjaWVzIHdlcmUgZm91bmQgaW4gb25seSAxIHllYXIsIGluY2x1ZGluZyAqTmFqYXMgbWlub3IqIGF0IENPTE8gaW4gMjAxNiwgKkVsYWVhZ251cyB1bWJlbGxhdGEqIGFuZCAqUG9seWdvbnVtIHBlcmZvbGlhdHVtKiBhdCBGSUlTIGluIDIwMTUsIGFuZCAqUnVidXMgcGhvZW5pY29sYXNpdXMqIGF0IEdBVEUgaW4gMjAxOC4gQXQgRklJUywgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2YgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiBkZWNsaW5lZCBmcm9tIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEZJSVMkYV8yMDA5JHBocmFnbWl0ZXNfYXVzdHJhbGlzJG1gJSBpbiAyMDA5IHRvIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEZJSVMkYV8yMDE1JHBocmFnbWl0ZXNfYXVzdHJhbGlzJG1gJSBpbiAyMDE1LCBidXQgdGhlbiBpbmNyZWFzZWQgYmFjayB0byBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRGSUlTJGFfMjAxNyRwaHJhZ21pdGVzX2F1c3RyYWxpcyRtYCUgaW4gMjAxNyAoRmlndXJlIDVhKS4gQXQgR0FURSBob3dldmVyLCB0aGUgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZiAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGRlY2xpbmVkIGZyb20gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTIkcGhyYWdtaXRlc19hdXN0cmFsaXMkbWAlIGluIDIwMTIgdG8gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTYkcGhyYWdtaXRlc19hdXN0cmFsaXMkbWAlIGluIDIwMTYgKEZpZ3VyZSA1YikuIEFsc28gYXQgR0FURSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXJhZ2Ugb2YgKkFydGVtaXNpYSB2dWxnYXJpcyogaW5jcmVhc2VkIHN1YnN0YW50aWFsbHkgZnJvbSBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRHQVRFJGFfMjAxNCRhcnRlbWlzaWFfdnVsZ2FyaXMkbWAlIGluIDIwMTQgdG8gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTgkYXJ0ZW1pc2lhX3Z1bGdhcmlzJG1gJSBpbiAyMDE4IChGaWd1cmUgNWIpLiBTaW1pbGFybHksIHRoZSBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mICpMb25pY2VyYSBqYXBvbmljYSogYXQgR0FURSBpbmNyZWFzZWQgZnJvbSBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRHQVRFJGFfMjAxMiRsb25pY2VyYV9qYXBvbmljJG1gJSBpbiAyMDEyIHRvIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEdBVEUkYV8yMDE4JGxvbmljZXJhX2phcG9uaWMkbWAlIGluIDIwMTggKEZpZ3VyZSA1YikuDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9Mywgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0gMy41fQ0KZ2dkcmF3KHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlciksDQogICAgICAgICAgICBzZV9jb3ZlciA9IHNkKG1lYW5fc2l0ZV9jb3Zlcikvc3FydChsZW5ndGgobWVhbl9zaXRlX2NvdmVyKSkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBtdXRhdGUobl95ZWFycyA9IG5fZGlzdGluY3QoWWVhcl9jaHIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgU2NpTmFtZV9sYWIgPSBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgICAiKSkgJT4lDQogIGZpbHRlcihuX3llYXJzID4gMSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX2NvdmVyKSkgKw0KICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2NvdmVyIC0gc2VfY292ZXIsIHltYXggPSBtZWFuX2NvdmVyICsgc2VfY292ZXIsIGdyb3VwID0gU2NpTmFtZV9sYWIpLCBjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMTAwKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFNjaU5hbWVfbGFiKSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBTY2lOYW1lX2xhYiksIHNoYXBlID0gMjEsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX3RleHQoZGF0YSA9IC4gJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCByZXBlYXQudGljay5sYWJlbHMgPSBUKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZlxuaW52YXNpdmUgc3BlY2llcyAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgICBzY2FsZV94X2RhdGUoZXhwYW5kID0gYyguMDQsIDApLCBzZWMuYXhpcyA9IGR1cF9heGlzKCksIGRhdGVfbGFiZWxzID0gIicleSIpICsNCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiU3BlY2llczoiKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJTcGVjaWVzOiIpKSArDQogICAgbGFicyhjYXB0aW9uID0gYnF1b3RlKGJvbGQoIkZpZ3VyZSA1LiIpfiJBdmVyYWdlIHJlbGF0aXZlIHBlcmNlbnQgY292ZXIgKCUpIG9mIGludmFzaXZlIHNwZWNpZXMgYXQgRklJUyAoYSkgYW5kIEdBVEUgKGIpLiIpKSArDQogICAgbGZlaGVSOjp0aGVtZShiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKA0KICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiksDQogICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSwgbGluZXR5cGUgPSAiZGFzaGVkIiksDQogICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gInRyYW5zcGFyZW50IikNCiAgKSkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZShib2xkKCJGaWd1cmUgNS4iKX4iQXZlcmFnZSByZWxhdGl2ZSBwZXJjZW50IGNvdmVyICglKSBvZiBpbnZhc2l2ZSBzcGVjaWVzIGF0IEZJSVMgKGEpIGFuZCBHQVRFIChiKS4iKSwgeCA9IDAuMDIsIHkgPSAwLjA0LCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpIA0KYGBgDQombmJzcDsNCg0KIyMjIyMgKlNhbGluaXR5IFRvbGVyYW5jZSoNCnwgICBBdCBBU0lTLCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgYmV0d2VlbiAyMDA4IHRvIDIwMTgsIHdoZXJlYXMgdGhlIGNvdW50IG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSByZW1haW5lZCBzdGFibGUgKEZpZ3VyZSA2YSkuIFNpbWlsYXJseSwgdGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIG9mIHNwZWNpZXMgaW4gYWxsIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yaWVzIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDZiKS4gSG93ZXZlciwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGxvdyBzYWxpbml0eSB0b2xlcmFuY2UgZGVjcmVhc2VkIHdoZXJlYXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgaW5jcmVhc2VkLCBhbmQgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDZjKS4gDQombmJzcDsNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNhbGluaXR5X3Bsb3QgPC0gZnVuY3Rpb24ocGFyaykgew0KICANCiAgc2FsX2NvdW50IDwtIHNpdGVfdmVnX2ZycV91c2RhICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2Uoc3BlY2llc19jb3VudCA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgICBtdXRhdGUodmFsdWVfbGFiZWwgPSBhcy5jaGFyYWN0ZXIocm91bmQoc3BlY2llc19jb3VudCwwKSkpDQogIA0KICBzYWxfZnJxIDwtIHNpdGVfdmVnX2ZycV91c2RhICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9mcnEgPSBtZWFuKGZycSkpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGZvcm1hdChyb3VuZChtZWFuX2ZycSwyKSwgbnNtYWxsID0gMikpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGlmX2Vsc2Uocm91bmQobWVhbl9mcnEsMikgPD0gMC4wNSwgTkEsIGZvcm1hdChyb3VuZChtZWFuX2ZycSwyKSwgbnNtYWxsID0gMikpKQ0KICANCiAgc2FsX2NvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTYWxpbml0eVRvbGVyYW5jZSkgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlcikpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGlmX2Vsc2Uocm91bmQobWVhbl9jb3ZlciwwKSA8PSA1LCBOQSwgcGFzdGUwKGZvcm1hdChyb3VuZChtZWFuX2NvdmVyLDApLCBuc21hbGwgPSAwKSMsICIlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKQ0KICANCiAgbGFiZnVuIDwtIGZ1bmN0aW9uKG1ldHJpY19kZiwgbWV0cmljX25hbWUpIHsNCiAgICBmIDwtIG1ldHJpY19kZiAlPiUNCiAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgIG11dGF0ZShzYWwgPSBmYWN0b3IoY2FzZV93aGVuKA0KICAgICAgICBTYWxpbml0eVRvbGVyYW5jZSA9PSAiSGlnaCIgfiAiSGlnaCAoPjE4IHBwdCkgICAiLA0KICAgICAgICBTYWxpbml0eVRvbGVyYW5jZSA9PSAiTWVkaXVtIiB+ICJNZWRpdW0gKDAuNS0xOCBwcHQpICAgIiwNCiAgICAgICAgU2FsaW5pdHlUb2xlcmFuY2UgPT0gIkxvdyIgfiAiTG93ICg8MC41IHBwdCkgICAiLA0KICAgICAgICBUIH4gTkENCiAgICAgICksIGxldmVscyA9IGMoIkhpZ2ggKD4xOCBwcHQpICAgIiwgIk1lZGl1bSAoMC41LTE4IHBwdCkgICAiLCAiTG93ICg8MC41IHBwdCkgICAiKSksDQogICAgICBZZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSkpICU+JQ0KICAgICAgZmlsdGVyKCFpcy5uYShzYWwpKQ0KICB9DQoNCiAgc2FsX2NvdW50MiA8LSBsYWJmdW4obWV0cmljX2RmID0gc2FsX2NvdW50LCBtZXRyaWNfbmFtZSA9ICJzcGVjaWVzX2NvdW50IikNCiAgc2FsX2ZycTIgPC0gbGFiZnVuKG1ldHJpY19kZiA9IHNhbF9mcnEsIG1ldHJpY19uYW1lID0gIm1lYW5fZnJxIikNCiAgc2FsX2NvdmVyMiA8LSBsYWJmdW4obWV0cmljX2RmID0gc2FsX2NvdmVyLCBtZXRyaWNfbmFtZSA9ICJtZWFuX2NvdmVyIikNCg0KICBnZ2Z1biA8LSBmdW5jdGlvbihtZXRyaWNfZGYyLCBtZXRyaWNfbmFtZSwgcGFya19uYW1lID0gcGFyayl7DQogICAgDQogICAgaWYobWV0cmljX25hbWUgPT0gInNwZWNpZXNfY291bnQiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQSkiDQogICAgICBtZXRyaWNfbGFiIDwtICJTcGVjaWVzIGNvdW50IChuKSINCiAgICAgIG1heF95IDwtIDE4DQogICAgICB2YWx1ZV90ZXh0X3NpemUgPC0gMy41DQogICAgICB5X2JyZWFrcyA8LSBzZXEoMCwxNSwgYnkgPSA1KQ0KICAgIH0gZWxzZSBpZihtZXRyaWNfbmFtZSA9PSAibWVhbl9mcnEiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQikiDQogICAgICBtZXRyaWNfbGFiIDwtICJGcmVxdWVuY3kiDQogICAgICBtYXhfeSA8LSAwLjk1DQogICAgICB5X2JyZWFrcyA8LSBzZXEoMCwgMC44LCBieSA9IDAuMikNCiAgICAgIHZhbHVlX3RleHRfc2l6ZSA8LSAyLjUNCiAgICB9IGVsc2UgaWYobWV0cmljX25hbWUgPT0gIm1lYW5fY292ZXIiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQykiDQogICAgICBtZXRyaWNfbGFiIDwtICJDb3ZlciAoJSkiDQogICAgICBtYXhfeSA8LSAxOTANCiAgICAgIHlfYnJlYWtzIDwtIHNlcSgwLDE1MCwgYnkgPSA1MCkNCiAgICAgIHZhbHVlX3RleHRfc2l6ZSA8LSAzLjUNCiAgICB9DQogICAgDQogICAgaWYocGFya19uYW1lID09ICJBU0lTIikgew0KICAgICAgcGFsIDwtIGFzaXNfcGFsW2MoMSw1LDkpXQ0KICAgIH0gZWxzZSBpZihwYXJrX25hbWUgPT0gIkNPTE8iKSB7DQogICAgICBwYWwgPC0gY29sb19wYWxbYygxLDUsOCldDQogICAgfSBlbHNlIGlmKHBhcmtfbmFtZSA9PSAiRklJUyIpIHsNCiAgICAgIHBhbCA8LSBmaWlzX3BhbFtjKDEsNSw5KV0NCiAgICB9IGVsc2UgaWYocGFya19uYW1lID09ICJHQVRFIikgew0KICAgICAgcGFsIDwtIGdhdGVfcGFsDQogICAgfSBlbHNlIGlmKHBhcmtfbmFtZSA9PSAiR0VXQSIpIHsNCiAgICAgIHBhbCA8LSBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZSgiIzExOGFiMiIsIG1vZGlmaWNhdGlvbiA9ICJnb19saWdodGVyIiwgbl9jb2xvcnMgPSAzKQ0KICAgIH0gZWxzZSBpZihwYXJrX25hbWUgPT0gIlNBSEkiKSB7DQogICAgICBwYWwgPC0gbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoIiMwNzNiNGMiLCBtb2RpZmljYXRpb24gPSAiZ29fbGlnaHRlciIsIG5fY29sb3JzID0gMykNCiAgICB9DQogICAgDQogICAgaWYocGFya19uYW1lID09ICJTQUhJIikgew0KICAgICAgdmFsdWVfdGV4dF9jb2xvciA8LSAid2hpdGUiDQogICAgfSBlbHNlIHsNCiAgICAgIHZhbHVlX3RleHRfY29sb3IgPC0gImJsYWNrIg0KICAgIH0NCiAgICANCiAgICBwYXJrX2xhYiA8LSBwYXN0ZTAocGFya19uYW1lLCAiOiIpDQogICAgDQogICAgaWYobWV0cmljX25hbWUgPT0gIm1lYW5fZnJxIil7DQogICAgICB4X3RpdGxlX2NvbG9yIDwtICJibGFjayINCiAgICB9IGVsc2Ugew0KICAgICAgeF90aXRsZV9jb2xvciA8LSAidHJhbnNwYXJlbnQiDQogICAgfQ0KICAgIA0KICAgIG1ldHJpY19kZjIgJT4lDQogICAgZ2dwbG90KC4sIGFlcyh4ID0gWWVhciwgeSA9IGV2YWwoc3ltKG1ldHJpY19uYW1lKSkpKSArDQogICAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHNhbCksIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHZhbHVlX2xhYmVsLCBncm91cCA9IHNhbCksIGNvbG9yID0gdmFsdWVfdGV4dF9jb2xvciwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSB2YWx1ZV90ZXh0X3NpemUsIGZhbWlseSA9ICJzZXJpZiIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgICAgIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWwgPSBkZXBhcnNlKGJxdW90ZShib2xkKC4obGV0dGVyX2xhYikpKSksIHggPSBzdHJ1Y3R1cmUoLUluZiwgY2xhc3MgPSAiRGF0ZSIpLCB5ID0gSW5mLCBoanVzdCA9IC0wLjIsIHZqdXN0ID0gMiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9ICJzZXJpZiIsIHBhcnNlID0gVCkgKw0KICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsLCBuYW1lID0gIlNhbGluaXR5IHRvbGVyYW5jZToiKSArDQogICAgICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMiB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJyV5IikgKw0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCxtYXhfeSksIGJyZWFrcyA9IHlfYnJlYWtzLCBleHBhbmQgPSBjKDAsMCksIG5hbWUgPSBtZXRyaWNfbGFiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKw0KICAgICAgdGhlbWUoDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAic2VyaWYiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLmxlbmd0aC54ID0gdW5pdCgwLCAicHQiKSwNCiAgICAgICAgYXhpcy50aWNrcy5sZW5ndGgueSA9IHVuaXQoLTQsICJwdCIpLA0KICAgICAgICBheGlzLnRpdGxlLnkucmlnaHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueS5sZWZ0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgbWFyZ2luID0gbWFyZ2luKHIgPSA1LCB1bml0ID0gInB0IikpLA0KICAgICAgICBheGlzLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSB4X3RpdGxlX2NvbG9yKSwNCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsDQogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKQ0KICAgICAgKQ0KICB9DQogIA0KICBjb3VudF9wbG90IDwtIGdnZnVuKG1ldHJpY19kZjIgPSBzYWxfY291bnQyLCBtZXRyaWNfbmFtZSA9ICJzcGVjaWVzX2NvdW50IikNCiAgZnJxX3Bsb3QgPC0gZ2dmdW4obWV0cmljX2RmMiA9IHNhbF9mcnEyLCBtZXRyaWNfbmFtZSA9ICJtZWFuX2ZycSIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQogIGNvdmVyX3Bsb3QgPC0gZ2dmdW4obWV0cmljX2RmMiA9IHNhbF9jb3ZlcjIsIG1ldHJpY19uYW1lID0gIm1lYW5fY292ZXIiKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KICANCiAgbGVnZW5kIDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQoY291bnRfcGxvdCkNCiAgY291bnRfcGxvdCA8LSBjb3VudF9wbG90ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KICANCiAgZ2dkcmF3KHBsb3RfZ3JpZChwbG90X2dyaWQoY291bnRfcGxvdCwgZnJxX3Bsb3QsIGNvdmVyX3Bsb3QsIG5yb3cgPSAxLCBieXJvdyA9IFQpLA0KICAgICAgICAgICAgICAgICAgIHBsb3RfZ3JpZChOVUxMLCBsZWdlbmQsIE5VTEwsIG5yb3cgPSAxLCBieXJvdyA9IFQsIHJlbF93aWR0aHMgPSBjKDAuMSwgMSwgMC4xKSksDQogICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMC4wNiksIG5yb3cgPSAyKSkNCn0NCmBgYA0KDQpgYGB7ciBGaWd1cmUgNiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJBU0lTIiksIHlsaW0gPSBjKC0wLjI1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA2LiIpfiJBU0lTIChhKSBzcGVjaWVzIGNvdW50LCAoYikgYXZlcmFnZSBmcmVxdWVuY3kgb2Ygb2NjdXJlbmNlLCBhbmQgKGMpIGF2ZXJhZ2UgcmVsYXRpdmUiKSwgeCA9IDAuMDIsIHkgPSAtMC4wOCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJwZXJjZW50IGNvdmVyICglKSBpbiBlYWNoIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yeS4gTm90ZSB0aGF0IGZyZXF1ZW5jeSB2YWx1ZXMgYmVsb3cgMC4wNSBhcmUgbm90IiksIHggPSAwLjAyLCB5ID0gLTAuMTQsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZSgic2hvd24uIiksIHggPSAwLjAyLCB5ID0gLTAuMiwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KfCAgIEF0IENPTE8sIHRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggbG93IGFuZCBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBiZXR3ZWVuIDIwMDggdG8gMjAxNiwgd2hlcmVhcyB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDdhKS4gU2ltaWxhcmx5LCBib3RoIHRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBhbmQgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZiBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSB3aGVyZWFzIHRoZSBmcmVxdWVuY3kgYW5kIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgb3ZlciB0aGUgc2FtZSB0aW1lIHBlcmlvZCAoRmlndXJlIDdiIGFuZCBjKS4NCiZuYnNwOw0KDQpgYGB7ciBGaWd1cmUgNywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJDT0xPIiksIHlsaW0gPSBjKC0wLjE4LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA3LiIpfiJDT0xPIChhKSBzcGVjaWVzIGNvdW50LCAoYikgYXZlcmFnZSBmcmVxdWVuY3kgb2Ygb2NjdXJlbmNlLCBhbmQgKGMpIGF2ZXJhZ2UgcmVsYXRpdmUiKSwgeCA9IDAuMDIsIHkgPSAtMC4wNywgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJwZXJjZW50IGNvdmVyICglKSBpbiBlYWNoIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yeS4iKSwgeCA9IDAuMDIsIHkgPSAtMC4xMywgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KfCAgIEF0IEZJSVMsIHRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggYm90aCBsb3cgYW5kIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBiZXR3ZWVuIDIwMDkgdG8gMjAxNywgd2hlcmVhcyB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgcmVtYWluZWQgc3RhYmxlIGR1cmluZyB0aGlzIHRpbWUgKEZpZ3VyZSA4YSkuIFRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBvZiBzcGVjaWVzIGluIGFsbCBzYWxpbml0eSB0b2xlcmFuY2UgY2F0ZWdvcmllcyByZW1haW5lZCBzdGFibGUgKEZpZ3VyZSA4YikuIFRoZSBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBsb3cgYW5kIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgaW5pdGlhbGx5IGRlY2xpbmVkIGJldHdlZW4gMjAwOSB0byAyMDEzLCBidXQgdGhlbiByZWNvdmVyZWQgYmV0d2VlbiAyMDEzIHRvIDIwMTcsIHdoZXJlYXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSBkdXJpbmcgdGhpcyB0aW1lIChGaWd1cmUgOGMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA4LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIkZJSVMiKSwgeWxpbSA9IGMoLTAuMjUsMSkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDguIil+IkZJSVMgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFyZSBub3QiKSwgeCA9IDAuMDIsIHkgPSAtMC4xNCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJzaG93bi4iKSwgeCA9IDAuMDIsIHkgPSAtMC4yLCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQp8ICAgQXQgR0FURSwgdGhlIGNvdW50IG9mIHNwZWNpZXMgaW4gYWxsIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yaWVzIHJlbWFpbmVkIHN0YWJsZSBiZXR3ZWVuIDIwMTAgdG8gMjAxOCAoRmlndXJlIDlhKS4gVGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIGFuZCBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBzbGlnaHRseSBvdmVyIHRoZSBzdHVkeSBwZXJpb2QgKEZpZ3VyZSA5YikuIFRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBvZiBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSBhbHNvIGluY3JlYXNlZCBzbGlnaHRseSBidXQgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBpbml0aWFsbHkgaW5jcmVhc2VkIGJldHdlZW4gMjAxMCB0byAyMDE2IGJ1dCB0aGVuIGRlY2xpbmVkIHN1YnN0YW50aWFsbHkgYmV0d2VlbiAyMDE2IGFuZCAyMDE4IChGaWd1cmUgOWMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIkdBVEUiKSwgeWxpbSA9IGMoLTAuMjUsMSkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDkuIil+IkdBVEUgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFuZCIpLCB4ID0gMC4wMiwgeSA9IC0wLjE0LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoImNvdmVyIHZhbHVlcyBiZWxvdyA1JSBhcmUgbm90IHNob3duLiIpLCB4ID0gMC4wMiwgeSA9IC0wLjIsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBHRVdBLCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgYmV0d2VlbiAyMDA4IHRvIDIwMTIgKEZpZ3VyZSAxMGEpLiBDb252ZXJzZWx5LCB0aGUgZnJlcXVlbmN5IG9mIG9jY3VycmVuY2Ugb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc2xpZ2h0bHkgb3ZlciB0aGUgc3R1ZHkgcGVyaW9kIChGaWd1cmUgMTBiKS4gSW50ZXJlc3RpbmdseSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBzbGlnaHRseSBkdXJpbmcgdGhlIHN0dWR5IHBlcmlvZCwgYWx0aG91Z2ggdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSBiZXR3ZWVuIDIwMDggdG8gMjAxMCwgYW5kIHRoZW4gZGVjbGluZWQgc2xpZ2h0bHkgYmV0d2VlbiAyMDEwIHRvIDIwMTIgKEZpZ3VyZSAxMGMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSAxMCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJHRVdBIiksIHlsaW0gPSBjKC0wLjI1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSAxMC4iKX4iR0VXQSAoYSkgc3BlY2llcyBjb3VudCwgKGIpIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIG9jY3VyZW5jZSwgYW5kIChjKSBhdmVyYWdlIHJlbGF0aXZlIiksIHggPSAwLjAyLCB5ID0gLTAuMDgsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZSgicGVyY2VudCBjb3ZlciAoJSkgaW4gZWFjaCBzYWxpbml0eSB0b2xlcmFuY2UgY2F0ZWdvcnkuIE5vdGUgdGhhdCBmcmVxdWVuY3kgdmFsdWVzIGJlbG93IDAuMDUgYXJlIG5vdCIpLCB4ID0gMC4wMiwgeSA9IC0wLjE0LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInNob3duLiIpLCB4ID0gMC4wMiwgeSA9IC0wLjIsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBTQUhJLCBubyBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSB3ZXJlIGZvdW5kIHRocm91Z2hvdXQgdGhlIGVudGlyZSBzdHVkeSBwZXJpb2QuIFRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggaGlnaCBzYWxpbml0eSB0b2xlcmFuY2UgZGVjcmVhc2VkIGJldHdlZW4gMjAwOSB0byAyMDE3IGFuZCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgcmVtYWluZWQgc3RhYmxlIChGaWd1cmUgMTFhKS4gVGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc2xpZ2h0bHkgYmV0d2VlbiAyMDA5IHRvIDIwMTMsIGJ1dCB0aGVuIGRlY2xpbmVkIGJldHdlZW4gMjAxMyB0byAyMDE3IChGaWd1cmUgMTFiKS4gQ29udmVyc2VseSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyBpbiBib3RoIHRoZSBtZWRpdW0gYW5kIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3JpZXMgZGVjbGluZWQgYmV0d2VlbiAyMDA5IHRvIDIwMTMgYnV0IHRoZW4gaW5jcmVhc2VkIGJldHdlZW4gMjAxMyB0byAyMDE3IChGaWd1cmUgMTFjKS4gDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDExLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIlNBSEkiKSwgeWxpbSA9IGMoLTAuMjUsMSkpKw0KICBkcmF3X2xhYmVsKGJxdW90ZShib2xkKCJGaWd1cmUgMTEuIil+IlNBSEkgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFyZSBub3QiKSwgeCA9IDAuMDIsIHkgPSAtMC4xNCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJzaG93bi4iKSwgeCA9IDAuMDIsIHkgPSAtMC4yLCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqQ29tbXVuaXR5IENvbXBvc2l0aW9uKg0KYGBge3IgQ29tbXVuaXR5IENvbXBvc2l0aW9uLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19tYXRyaXggPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoRXZlbnRJRCwgVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyKSAlPiUNCiAgZ3JvdXBfYnkoRXZlbnRJRCwgVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gIlNjaU5hbWVfY29yIiwgdmFsdWVzX2Zyb20gPSAicmVsX3BlcmNlbnRfY292ZXIiLCB2YWx1ZXNfZmlsbCA9IDApICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkNCg0KYWRvIDwtIGZ1bmN0aW9uKHBhcmspew0KICANCiAgc2V0LnNlZWQoMTA0MDMpDQogIA0KICBhZG9fc3BlY2llcyA8LSBzcGVjaWVzX21hdHJpeCAlPiUNCiAgICBhcnJhbmdlKEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLmRvdWJsZSksIH5tZWFuKC54KSkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoLWMoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikpDQogIA0KICBhZG9fZW52IDwtIHNwZWNpZXNfbWF0cml4ICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBzZWxlY3QoVW5pcXVlSUQsIFllYXJfY2hyKSAlPiUNCiAgICBkaXN0aW5jdCgpDQogIA0KICBhZG9fbW9kIDwtIGFkb25pczIoYWRvX3NwZWNpZXMgfiBZZWFyX2NociwgZGF0YSA9IGFkb19lbnYpDQogIA0KICBpZihwYXJrID09ICJDT0xPIikgew0KICBhZG9fcGFpcndpc2UgPC0gcGFpcndpc2VBZG9uaXM6OnBhaXJ3aXNlLmFkb25pcyhhZG9fc3BlY2llcywgYWRvX2VudiRZZWFyX2NocikgJT4lDQogICAgZmlsdGVyKHAudmFsdWUgPCAwLjA1KQ0KICB9IGVsc2Ugew0KICBhZG9fcGFpcndpc2UgPC0gcGFpcndpc2VBZG9uaXM6OnBhaXJ3aXNlLmFkb25pcyhhZG9fc3BlY2llcywgYWRvX2VudiRZZWFyX2NocikgJT4lDQogICBmaWx0ZXIocC5hZGp1c3RlZCA8IDAuMDUpDQogIH0NCiAgDQogIGxpc3QoInNwZWNpZXMiID0gYWRvX3NwZWNpZXMsICJlbnYiID0gYWRvX2VudiwgIm1vZCIgPSBhZG9fbW9kLCAicGFpcndpc2UiID0gYWRvX3BhaXJ3aXNlKQ0KfQ0KDQphZG9fYXNpcyA8LSBhZG8oIkFTSVMiKQ0KYWRvX2NvbG8gPC0gYWRvKCJDT0xPIikNCmFkb19maWlzIDwtIGFkbygiRklJUyIpDQphZG9fZ2F0ZSA8LSBhZG8oIkdBVEUiKQ0KDQphZG9fc3BlY2llcyA8LSBmdW5jdGlvbihwYXJrLCBpbmNsdWRlX3ZlY3RvciA9IE5VTEwsIHRocmVzaG9sZF92YWwgPSBOVUxMKSB7DQogIA0KICBwYXJrX2NvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIA0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fc2l0ZV9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4obWVhbl9zaXRlX2NvdmVyKSkgDQogIA0KICB5ZWFycyA8LSBwYXJrX2NvdmVyICU+JQ0KICAgIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgICBmaXJzdF9kYXRlID0gYXMuaW50ZWdlcihsdWJyaWRhdGU6OnllYXIobWluKFllYXIpKSksDQogICAgICAgICAgIGxhc3RfZGF0ZSA9IGFzLmludGVnZXIobHVicmlkYXRlOjp5ZWFyKG1heChZZWFyKSkpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KGZpcnN0X2RhdGUsIGxhc3RfZGF0ZSkgJT4lDQogICAgZGlzdGluY3QoKQ0KICANCiAgeWVhcl9saXN0IDwtIGFzLmxpc3Qoc2VxKHllYXJzJGZpcnN0X2RhdGUsIHllYXJzJGxhc3RfZGF0ZSwgYnkgPSAyKSkgJT4lIG1hcCguLCB+YXMuY2hhcmFjdGVyKC54KSkNCiAgDQogIHllYXJfbGlzdF9jb21ib3MgPC0gYXMuZGF0YS5mcmFtZShleHBhbmQuZ3JpZCgiY29sMSIgPSB5ZWFyX2xpc3QsICJjb2wyIiA9IHllYXJfbGlzdCkpDQoNCiAgZGZfZmlsdGVyX2Z1biA8LSBmdW5jdGlvbih5ZWFyMSwgeWVhcjIpIHsNCiAgICBwYXJrX3llYXIxIDwtIHBhcmtfY292ZXIgJT4lIGZpbHRlcihZZWFyX2NociA9PSB5ZWFyMSkNCiAgICBwYXJrX3llYXIyIDwtIHBhcmtfY292ZXIgJT4lIGZpbHRlcihZZWFyX2NociA9PSB5ZWFyMikNCg0KICAgIGRmIDwtIGZ1bGxfam9pbihwYXJrX3llYXIxLCBwYXJrX3llYXIyLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgICAgbXV0YXRlKGNvdmVyX2RpZiA9IG1lYW5fY292ZXIueSAtIG1lYW5fY292ZXIueCkgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKGNvdmVyX2RpZikpDQogICAgDQogICAgaWYoIWlzLm51bGwodGhyZXNob2xkX3ZhbCkpIHsNCiAgICAgIHBhcmtfeWVhcjFfeWVhcjIgPC0gZGYgJT4lDQogICAgICAgIGZpbHRlcihjb3Zlcl9kaWYgPCB0aHJlc2hvbGRfdmFsKi0xIHwgY292ZXJfZGlmID4gdGhyZXNob2xkX3ZhbCkNCiAgICB9IGVsc2Ugew0KICAgICAgcGFya195ZWFyMV95ZWFyMiA8LSBkZg0KICAgIH0NCiAgICByZXR1cm4ocGFya195ZWFyMV95ZWFyMikNCiAgfSANCiAgDQogIGRmX25hbWVzIDwtIHllYXJfbGlzdF9jb21ib3MgJT4lDQogICAgbXV0YXRlKG5hbWVzID0gcGFzdGUwKHBhcmssICJfIiwgY29sMSwgIl8iLCBjb2wyKSkgJT4lDQogICAgcHVsbChuYW1lcykNCiAgDQogIHBhcmtfc3BlY2llc19kaWZzIDwtIG1hcDIoDQogICAgeWVhcl9saXN0X2NvbWJvcyRjb2wxLCANCiAgICB5ZWFyX2xpc3RfY29tYm9zJGNvbDIsIA0KICAgIH5kZl9maWx0ZXJfZnVuKHllYXIxID0gLngsIHllYXIyID0gLnkpKSAlPiUNCiAgICBzZXRfbmFtZXMoLiwgbm0gPSBkZl9uYW1lcykgJT4lDQogICAgYmluZF9yb3dzKCkgJT4lDQogICAgZmlsdGVyKGNvdmVyX2RpZiAhPSAwKSAlPiUNCiAgICBtdXRhdGUoeWVhcl9jb21ibyA9IHBhc3RlMChZZWFyX2Noci54LCAiIHZzICIsIFllYXJfY2hyLnkpKQ0KICANCiAgaWYoaXMubnVsbChpbmNsdWRlX3ZlY3Rvcikpew0KICAgIHBhcmtfc3BlY2llc19kaWZzIDwtIHBhcmtfc3BlY2llc19kaWZzDQogIH0gZWxzZSB7DQogICAgcGFya19zcGVjaWVzX2RpZnMgPC0gcGFya19zcGVjaWVzX2RpZnMgJT4lIGZpbHRlcih5ZWFyX2NvbWJvICVpbiUgaW5jbHVkZV92ZWN0b3IpDQogIH0NCn0NCg0KYWRvX3NwZWNpZXNfYXNpcyA8LSBhZG9fc3BlY2llcygiQVNJUyIsIGluY2x1ZGVfdmVjdG9yID0gYXMubGlzdChhZG9fYXNpcyRwYWlyd2lzZSRwYWlycykpICU+JQ0KICBncm91cF9ieSh5ZWFyX2NvbWJvKSAlPiUNCiAgbXV0YXRlKGFic19kaWYgPSBhYnMoY292ZXJfZGlmKSkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IGFic19kaWYsIG4gPSA1KQ0KDQphZG9fc3BlY2llc19jb2xvIDwtIGFkb19zcGVjaWVzKCJDT0xPIiwgaW5jbHVkZV92ZWN0b3IgPSBhcy5saXN0KGFkb19jb2xvJHBhaXJ3aXNlJHBhaXJzKSkgJT4lDQogIGdyb3VwX2J5KHllYXJfY29tYm8pICU+JQ0KICBtdXRhdGUoYWJzX2RpZiA9IGFicyhjb3Zlcl9kaWYpKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYWJzX2RpZiwgbiA9IDUpDQoNCmFkb19zcGVjaWVzX2ZpaXMgPC0gYWRvX3NwZWNpZXMoIkZJSVMiLCBpbmNsdWRlX3ZlY3RvciA9IGFzLmxpc3QoYWRvX2ZpaXMkcGFpcndpc2UkcGFpcnMpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9jb21ibykgJT4lDQogIG11dGF0ZShhYnNfZGlmID0gYWJzKGNvdmVyX2RpZikpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBhYnNfZGlmLCBuID0gNSkNCmBgYA0KDQp8ICAgTm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBjb21tdW5pdHkgY29tcG9zaXRpb24gd2FzIGZvdW5kIGJldHdlZW4gYW55IG9mIHRoZSB5ZWFycyBhdCBHQVRFICgqUioyID0gYHIgZm9ybWF0KHJvdW5kKGFkb19nYXRlJG1vZCRSMlsxXSwgMiksIG5zbWFsbCA9IDIpYCwgKnAqID0gKm5zKikuIEF0IEFTSVMsIHRoZSBwZXJtdXRhdGlvbmFsIGFuYWx5c2lzIG9mIHZhcmlhbmNlIChBRE9OSVMpIGZvdW5kIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBjb21tdW5pdHkgY29tcG9zaXRpb24gYmV0d2VlbiB5ZWFycyAoKlIqMiA9IGByIGZvcm1hdChyb3VuZChhZG9fYXNpcyRtb2QkUjJbMV0sIDIpLCBuc21hbGwgPSAyKWAsICpwKiA8IDAuMDAxKS4gQW4gZXhhbWluYXRpb24gb2YgdGhlIHBhaXJ3aXNlIGNvbXBhcmlzb25zIGJldHdlZW4geWVhcnMgYXQgQVNJUyBmb3VuZCBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIDIwMDggdnMuIDIwMTYsIDIwMDggdnMuIDIwMTgsIDIwMTAgdnMuIDIwMTQsIGFuZCAyMDE0IHZzLiAyMDE4IChGaWd1cmUgOSkuIFRoZSBzcGVjaWVzIHdpdGggdGhlIHRvcCA1IGxhcmdlc3QgY2hhbmdlcyBpbiBjb3ZlciB0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIDQgeWVhci1wYWlycyBhdCBBU0lTIGFyZSBzaG93biBpbiBGaWd1cmUgOS4gU29tZSBub3RhYmxlIGRpZmZlcmVuY2VzIGluY2x1ZGU6DQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgZ2VyYXJkaWkqIGZyb20gYHIgYWRvX3NwZWNpZXNfYXNpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMgZ2VyYXJkaWkiICYgWWVhcl9jaHIueCA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIGdlcmFyZGlpIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMiAoRmlndXJlIDlhKS4NCi0gQW4gaW5jcmVhc2UgaW4gKlBpbnVzIHRhZWRhKiBmcm9tIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiUGludXMgdGFlZGEiICYgWWVhcl9jaHIueSA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiUGludXMgdGFlZGEiICYgWWVhcl9jaHIueCA9PSAiMjAxNiIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE2IChGaWd1cmUgOWIpLg0KLSBBbiBpbmNyZWFzZSBpbiAqQmFjY2hhcmlzIGhhbGltaWZvbGlhKiBmcm9tIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiQmFjY2hhcmlzIGhhbGltaWZvbGlhIiAmIFllYXJfY2hyLnkgPT0gIjIwMDgiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAwOCB0byBgciBhZG9fc3BlY2llc19hc2lzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkJhY2NoYXJpcyBoYWxpbWlmb2xpYSIgJiBZZWFyX2Noci54ID09ICIyMDE4IikgJT4lIG11dGF0ZShtZWFuX2NvdmVyID0gcm91bmQobWVhbl9jb3Zlci54LDApKSAlPiUgcHVsbChtZWFuX2NvdmVyKWAlIGluIDIwMTggKEZpZ3VyZSA5YykuDQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgZ2VyYXJkaWkqIGZyb20gYHIgYWRvX3NwZWNpZXNfYXNpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMgZ2VyYXJkaWkiICYgWWVhcl9jaHIueCA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIGdlcmFyZGlpIiAmIFllYXJfY2hyLnkgPT0gIjIwMTQiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNCAoRmlndXJlIDlkKS4NCiZuYnNwOw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYWRvX3Bsb3QgPC0gZnVuY3Rpb24ocGFyaywgeWVhcl9jb21ib3MsIHllYXJfY2hyX2xpc3RzKSB7DQogIA0KICBhZG9fc3BlY2llc19saXN0IDwtIGV2YWwoc3ltKHBhc3RlMCgiYWRvX3NwZWNpZXNfIiwgdG9sb3dlcihwYXJrKSkpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KFNjaU5hbWVfY29yKSAlPiUNCiAgICB1bmlxdWUoKSAlPiUNCiAgICBwdWxsKCkNCiAgDQogIHBsb3RfZGYgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFyaykgJT4lDQogICAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3NpdGVfY292ZXIgPSBtZWFuKHJlbF9wZXJjZW50X2NvdmVyKSkgJT4lDQogICAgZmlsdGVyKFNjaU5hbWVfY29yICVpbiUgYWRvX3NwZWNpZXNfbGlzdCkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlciksDQogICAgICAgICAgICAgIHNlX2NvdmVyID0gc2QobWVhbl9zaXRlX2NvdmVyKS9zcXJ0KGxlbmd0aChtZWFuX3NpdGVfY292ZXIpKSkgJT4lDQogICAgbGVmdF9qb2luKC4sIGV2YWwoc3ltKHBhc3RlMCgiYWRvX3NwZWNpZXNfIiwgdG9sb3dlcihwYXJrKSkpKVtjKCJTY2lOYW1lX2NvciIsICJ5ZWFyX2NvbWJvIildLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIG11dGF0ZSh5ZWFyMSA9IGFzLmludGVnZXIoc3RyX3N1Yih5ZWFyX2NvbWJvLCAxLCA0KSksDQogICAgICAgICAgIHllYXIyID0gYXMuaW50ZWdlcihzdHJfc3ViKHllYXJfY29tYm8sIDksIDEyKSksDQogICAgICAgICAgIGxvd2VyX3llYXIgPSBpZl9lbHNlKHllYXIxIDwgeWVhcjIsIHllYXIxLCB5ZWFyMiksDQogICAgICAgICAgIGhpZ2hlcl95ZWFyID0gaWZfZWxzZSh5ZWFyMiA+IHllYXIxLCB5ZWFyMiwgeWVhcjEpLA0KICAgICAgICAgICB5ZWFyX2NvbWJvX2dyb3VwID0gcGFzdGUwKGxvd2VyX3llYXIsICIgdnMuICIsIGhpZ2hlcl95ZWFyKSwNCiAgICAgICAgICAgWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgICBTY2lOYW1lX2Nvcl9sYWIgPSBpZl9lbHNlKFNjaU5hbWVfY29yICVpbiVjKCJDYXJleCIsICJTYWxpY29ybmlhIiwgIkp1bmN1cyIpLCBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgc3BwLiIpLCBTY2lOYW1lX2NvcikpDQogIA0KICBnIDwtIG1hcDIoeWVhcl9jb21ib3MsIHllYXJfY2hyX2xpc3RzLCB+cGxvdF9kZiAlPiUgZmlsdGVyKHllYXJfY29tYm8gPT0gLnggJiBZZWFyX2NociAlaW4lIC55KSkNCiAgDQogIGxlZ2VuZF90aXRsZSA8LSBwYXN0ZTAocGFyaywgIjogdG9wIHNwZWNpZXMgY29udHJpYnV0aW5nIHRvIGRpZmZlcmVuY2VzIGJldHdlZW4geWVhcnMiKQ0KICANCiAgZ2dwbG90KHBsb3RfZGYsIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5fY292ZXIsIGNvbG9yID0gU2NpTmFtZV9jb3JfbGFiLCBmaWxsID0gU2NpTmFtZV9jb3JfbGFiKSkgKw0KICAgIGdlb21fbGluZSgpICsNCiAgICBtYXAoZywgfmdlb21fcG9pbnQoZGF0YSA9IC54LCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX2NvdmVyKSwgc2l6ZSA9IDIsIGNvbG9yID0gImJsYWNrIiwgc2hhcGUgPSAyMSkpICsNCiAgICBnZW9tX3RleHQoZGF0YSA9IC4gJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoeWVhcl9jb21ib19ncm91cCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoeWVhcl9jb21ib19ncm91cCkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShsZXR0ZXIgPSBwYXN0ZTAoIigiLExFVFRFUlNbMTpuKCldLCAiKSIpLA0KICAgICAgICAgICAgICAgICAgICAgZiA9IHBtYXBfY2hyKGxpc3QobGV0dGVyLCB5ZWFyX2NvbWJvX2dyb3VwKSwgZnVuY3Rpb24oYSwgYikgZGVwYXJzZShicXVvdGUoYm9sZCguKGEpfnBsYWluKC4oYikpKSkpKSksDQogICAgYWVzKHggPSBzdHJ1Y3R1cmUoLUluZiwgY2xhc3MgPSAiRGF0ZSIpLCB5ID0gIEluZiwgbGFiZWwgPSBmKSwNCiAgICAgICAgICAgIGhqdXN0ID0gLTAuMiwgdmp1c3QgPSAyLCBzaXplICA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9ICJzZXJpZiIsIHBhcnNlID0gVCwgaW5oZXJpdC5hZXMgPSBGKSArDQogICAgbGVtb246OmZhY2V0X3JlcF93cmFwKH55ZWFyX2NvbWJvX2dyb3VwKSArDQogICAge2lmKHBhcmsgPT0gIkZJSVMiKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOS0wMS0wMSIpLCBhcy5EYXRlKCIyMDE3LTAxLTAxIikpLCBicmVha3MgPSBzZXEuRGF0ZShhcy5EYXRlKCIyMDA5LTAxLTAxIiksIGFzLkRhdGUoIjIwMTctMDEtMDEiKSwgYnkgPSAiMiB5ZWFycyIpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkFTSVMiKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOC0wMS0wMSIpLCBhcy5EYXRlKCIyMDE4LTAxLTAxIikpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkNPTE8iKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOC0wMS0wMSIpLCBhcy5EYXRlKCIyMDE2LTAxLTAxIikpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkZJSVMiKQ0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDApLCBuYW1lID0gIkF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgKCUpIiwgc2VjLmF4aXMgPSBkdXBfYXhpcygpKX0gKw0KICAgIHtpZihwYXJrICVpbiUgYygiQVNJUyIsICJDT0xPIikpIA0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQXZlcmFnZSByZWxhdGl2ZSBjb3ZlciAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gbGVnZW5kX3RpdGxlLCBuY29sID0gMiksIGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBsZWdlbmRfdGl0bGUsIG5jb2wgPSAyKSkgKw0KICAgIGxmZWhlUjo6dGhlbWUoYmFzZV9zaXplID0gMTIpICsNCiAgICB0aGVtZSgNCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ociA9IDEwLCB1bml0ID0gInB0IikpLA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBzaXplID0gMTIpLA0KICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJ0cmFuc3BhcmVudCIpLA0KICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgbGVnZW5kLnRpdGxlLnBvc2l0aW9uID0gInRvcCIsDQogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSwNCiAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4odCA9IDAsIHVuaXQgPSAicHQiKSwNCiAgICAgIGxlZ2VuZC5rZXkuc3BhY2luZy55ID0gdW5pdCgwLCAicHQiKSwNCiAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gMC41LA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEwLCAicHQiKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpDQogICAgKQ0KfQ0KYGBgDQoNCmBgYHtyIEZpZ3VyZSAxMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD03LCBvdXQud2lkdGg9Ni41LCBvdXQuaGVpZ2h0PTd9DQphZG9fcGxvdCgiQVNJUyIsIHllYXJfY29tYm9zID0gYygiMjAxNiB2cyAyMDA4IiwgIjIwMTggdnMgMjAwOCIsICIyMDA4IHZzIDIwMTIiLCAiMjAxMCB2cyAyMDE0IiksIHllYXJfY2hyX2xpc3RzID0gbGlzdChjKCIyMDA4IiwgIjIwMTYiKSwgYygiMjAwOCIsICIyMDE4IiksIGMoIjIwMDgiLCAiMjAxMiIpLCBjKCIyMDEwIiwgIjIwMTQiKSkpDQpgYGANCiZuYnNwOw0KDQp8ICAgQXQgQ09MTywgdGhlIHBlcm11dGF0aW9uYWwgYW5hbHlzaXMgb2YgdmFyaWFuY2UgKEFET05JUykgZm91bmQgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGNvbW11bml0eSBjb21wb3NpdGlvbiBiZXR3ZWVuIHllYXJzICgqUioyID0gYHIgZm9ybWF0KHJvdW5kKGFkb19jb2xvJG1vZCRSMlsxXSwgMiksIG5zbWFsbCA9IDIpYCwgKnAqIDwgMC4wNSkuIEFuIGV4YW1pbmF0aW9uIG9mIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBiZXR3ZWVuIHllYXJzIGF0IENPTE8gZm91bmQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiAyMDA4IHZzLiAyMDEwLCAyMDEwIHZzLiAyMDEyLCAyMDEwIHZzLiAyMDE0LCBhbmQgMjAxMCB2cy4gMjAxNiAoRmlndXJlIDEwKS4gVGhlIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgbGFyZ2VzdCBjaGFuZ2VzIGluIGNvdmVyIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgNCB5ZWFyLXBhaXJzIGF0IENPTE8gYXJlIHNob3duIGluIEZpZ3VyZSAxMC4gU29tZSBub3RhYmxlIGRpZmZlcmVuY2VzIGluY2x1ZGU6DQotIEEgZGVjcmVhc2UgaW4gKkxpbGFlb3BzaXMgY2hpbmVuc2lzKiBmcm9tIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTGlsYWVvcHNpcyBjaGluZW5zaXMiICYgWWVhcl9jaHIueCA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTGlsYWVvcHNpcyBjaGluZW5zaXMiICYgWWVhcl9jaHIueSA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIChGaWd1cmUgMTBhKS4NCi0gQSBkZWNyZWFzZSBpbiAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGZyb20gYHIgYWRvX3NwZWNpZXNfY29sbyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJQaHJhZ21pdGVzIGF1c3RyYWxpcyIgJiBZZWFyX2Noci54ID09ICIyMDEwIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMCB0byBgciBhZG9fc3BlY2llc19jb2xvICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMiAoRmlndXJlIDEwYikuDQotIEEgaW5jcmVhc2UgaW4gKlppemFuaW9wc2lzIG1pbGlhY2VhKiBmcm9tIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiWml6YW5pb3BzaXMgbWlsaWFjZWEiICYgWWVhcl9jaHIueCA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIHRvIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiWml6YW5pb3BzaXMgbWlsaWFjZWEiICYgWWVhcl9jaHIueSA9PSAiMjAxNCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE0IChGaWd1cmUgMTBjKS4NCi0gQW4gaW5jcmVhc2UgaW4gKlppemFuaWEgYXF1YXRpY2EqIGZyb20gYHIgYWRvX3NwZWNpZXNfY29sbyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJaaXphbmlhIGFxdWF0aWNhIiAmIFllYXJfY2hyLnkgPT0gIjIwMTAiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMCB0byBgciBhZG9fc3BlY2llc19jb2xvICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIlppemFuaWEgYXF1YXRpY2EiICYgWWVhcl9jaHIueCA9PSAiMjAxNiIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE2IChGaWd1cmUgMTBkKS4NCg0KYGBge3IgRmlndXJlIDEzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTcsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9N30NCmFkb19wbG90KCJDT0xPIiwgeWVhcl9jb21ib3MgPSBjKCIyMDA4IHZzIDIwMTAiLCAiMjAxMCB2cyAyMDEyIiwgIjIwMTAgdnMgMjAxNCIsICIyMDE2IHZzIDIwMTAiKSwgeWVhcl9jaHJfbGlzdHMgPSBsaXN0KGMoIjIwMDgiLCAiMjAxMCIpLCBjKCIyMDEwIiwgIjIwMTIiKSwgYygiMjAxMCIsICIyMDE0IiksIGMoIjIwMTAiLCAiMjAxNiIpKSkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBGSUlTLCB0aGUgcGVybXV0YXRpb25hbCBhbmFseXNpcyBvZiB2YXJpYW5jZSAoQURPTklTKSBmb3VuZCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gY29tbXVuaXR5IGNvbXBvc2l0aW9uIGJldHdlZW4geWVhcnMgKCpSKjIgPSBgciBmb3JtYXQocm91bmQoYWRvX2ZpaXMkbW9kJFIyWzFdLCAyKSwgbnNtYWxsID0gMilgLCAqcCogPCAwLjAwMSkuIEFuIGV4YW1pbmF0aW9uIG9mIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBiZXR3ZWVuIHllYXJzIGF0IEZJSVMgZm91bmQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiAyMDExIHZzLiAyMDE3IGFuZCAyMDE1IHZzLiAyMDE3IChGaWd1cmUgMTEpLiBUaGUgc3BlY2llcyB3aXRoIHRoZSB0b3AgNSBsYXJnZXN0IGNoYW5nZXMgaW4gY292ZXIgdGhhdCBjb250cmlidXRlZCB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVzZSAyIHllYXItcGFpcnMgYXQgRklJUyBhcmUgc2hvd24gaW4gRmlndXJlIDExLiBTb21lIG5vdGFibGUgZGlmZmVyZW5jZXMgaW5jbHVkZToNCi0gQSBkZWNyZWFzZSBpbiAqSnVuY3VzIHNwcC4qIGZyb20gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMiICYgWWVhcl9jaHIueSA9PSAiMjAxMSIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDExIHRvIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYSkuDQotIEFuIGluY3JlYXNlIGluICpUZXVjcml1bSBjYW5hZGVuc2UqIGZyb20gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJUZXVjcml1bSBjYW5hZGVuc2UiICYgWWVhcl9jaHIueSA9PSAiMjAxMSIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDExIHRvIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiVGV1Y3JpdW0gY2FuYWRlbnNlIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYSkuDQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgY2FuYWRlbnNpcyogZnJvbSBgciBhZG9fc3BlY2llc19maWlzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkp1bmN1cyBjYW5hZGVuc2lzIiAmIFllYXJfY2hyLnkgPT0gIjIwMTUiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNSB0byBgciBhZG9fc3BlY2llc19maWlzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkp1bmN1cyBjYW5hZGVuc2lzIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYikuDQotIEFuIGluY3JlYXNlIGluICpNaWthbmlhIHNjYW5kZW5zKiBmcm9tIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTWlrYW5pYSBzY2FuZGVucyIgJiBZZWFyX2Noci55ID09ICIyMDE1IikgJT4lIG11dGF0ZShtZWFuX2NvdmVyID0gcm91bmQobWVhbl9jb3Zlci55LDApKSAlPiUgcHVsbChtZWFuX2NvdmVyKWAlIGluIDIwMTUgdG8gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJNaWthbmlhIHNjYW5kZW5zIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYikuDQoNCmBgYHtyIEZpZ3VyZSAxNCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD01LCBvdXQud2lkdGg9Ni41LCBvdXQuaGVpZ2h0PTV9DQphZG9fcGxvdCgiRklJUyIsIHllYXJfY29tYm9zID0gYygiMjAxNyB2cyAyMDExIiwgIjIwMTcgdnMgMjAxNSIpLCB5ZWFyX2Nocl9saXN0cyA9IGxpc3QoYygiMjAxNyIsICIyMDExIiksIGMoIjIwMTciLCAiMjAxNSIpKSkNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIFR1cm5vdmVyLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI3R1cm5vdmVyDQp0dXJub3Zlcl9mdW4gPC0gZnVuY3Rpb24ocGFyaykgew0KICB0dXJuX2RmIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIG11dGF0ZSh5ZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSksDQogICAgICAgICAgIGZpcnN0X3llYXIgPSBmaXJzdCh5ZWFyKSwNCiAgICAgICAgICAgeWVhcnNfbnVtID0gYXMubnVtZXJpYyh5ZWFyIC0gZmlyc3RfeWVhcikvMzY1LjI1LA0KICAgICAgICAgICBpZCA9IGFzLmZhY3RvcihVbmlxdWVJRCksDQogICAgICAgICAgIHNwZWNpZXMgPSBhcy5mYWN0b3IoU2NpTmFtZV9jb3IpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KC1jKFVuaXF1ZUlELCB5ZWFyLCBmaXJzdF95ZWFyLCBTY2lOYW1lX2NvcikpDQogIA0KICB5ZWFyc19kZiA8LSB0dXJuX2RmICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoWWVhcl9jaHIsIHllYXJzX251bSkgJT4lDQogICAgZGlzdGluY3QoKQ0KICANCiAgdG90YWxfdHVybiA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJ0b3RhbCIpICU+JQ0KICAgIG11dGF0ZShVbml0Q29kZSA9IHBhcmspICU+JQ0KICAgIGxlZnRfam9pbiguLCB5ZWFyc19kZiwgYnkgPSBjKCJ5ZWFyc19udW0iKSkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl90dXJuID0gbWVhbih0b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgc2VfdHVybiA9IHNkKHRvdGFsKS9zcXJ0KGxlbmd0aCh0b3RhbCkpLA0KICAgICAgICAgICAgICB0eXBlID0gInRvdGFsIikNCiAgDQogIGFwcGVhciA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJhcHBlYXJhbmNlIikgJT4lDQogICAgbXV0YXRlKFVuaXRDb2RlID0gcGFyaykgJT4lDQogICAgbGVmdF9qb2luKC4sIHllYXJzX2RmLCBieSA9IGMoInllYXJzX251bSIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3R1cm4gPSBtZWFuKGFwcGVhcmFuY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIHNlX3R1cm4gPSBzZChhcHBlYXJhbmNlKS9zcXJ0KGxlbmd0aChhcHBlYXJhbmNlKSksDQogICAgICAgICAgICAgIHR5cGUgPSAiYXBwZWFyIikNCiAgDQogIGRpc2FwcGVhciA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJkaXNhcHBlYXJhbmNlIikgJT4lDQogICAgbXV0YXRlKFVuaXRDb2RlID0gcGFyaykgJT4lDQogICAgbGVmdF9qb2luKC4sIHllYXJzX2RmLCBieSA9IGMoInllYXJzX251bSIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3R1cm4gPSBtZWFuKGRpc2FwcGVhcmFuY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIHNlX3R1cm4gPSBzZChkaXNhcHBlYXJhbmNlKS9zcXJ0KGxlbmd0aChkaXNhcHBlYXJhbmNlKSksDQogICAgICAgICAgICAgIHR5cGUgPSAiZGlzYXBwZWFyIikNCiAgDQogIHR1cm4gPC0gYmluZF9yb3dzKHRvdGFsX3R1cm4sIGFwcGVhciwgZGlzYXBwZWFyKSAlPiUNCiAgICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpKQ0KfQ0KDQp0dXJub3Zlcl9kZiA8LSBtYXAobGlzdCgiQVNJUyIsICJDT0xPIiwgIkZJSVMiLCAiR0FURSIsICJHRVdBIiwgIlNBSEkiKSwgfnR1cm5vdmVyX2Z1bigueCkpICU+JQ0KICBiaW5kX3Jvd3MoKSAlPiUNCiAgbXV0YXRlKHR5cGVfbGFiID0gY2FzZV93aGVuKA0KICAgIHR5cGUgPT0gImFwcGVhciIgfiAiYXBwZWFyYW5jZXMgICAiLA0KICAgIHR5cGUgPT0gImRpc2FwcGVhciIgfiAiZGlzYXBwZWFyYW5jZXMgICAiLA0KICAgIHR5cGUgPT0gInRvdGFsIiB+ICJ0b3RhbCB0dXJub3ZlciAgICINCiAgKSkNCg0KZ2dwbG90KHR1cm5vdmVyX2RmLCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX3R1cm4sIGNvbG9yID0gdHlwZV9sYWIpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHR5cGVfbGFiKSwgc2hhcGUgPSAyMSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMikgKyANCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgbGVtb246OmZhY2V0X3JlcF93cmFwKH5Vbml0Q29kZSkgKw0KICBzY2FsZV94X2RhdGUobGltaXRzID0gYyhhcy5EYXRlKCIyMDA4LTAxLTAxIiksIGFzLkRhdGUoIjIwMTgtMDEtMDEiKSksIGRhdGVfbGFiZWxzID0gIicleSIsIGJyZWFrcyA9IHNlcS5EYXRlKGFzLkRhdGUoIjIwMDgtMDEtMDEiKSwgYXMuRGF0ZSgiMjAxOC0wMS0wMSIpLCBieSA9ICIyIHllYXJzIiksIHNlYy5heGlzID0gZHVwX2F4aXMoKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDAuOSksIGJyZWFrcyA9IHNlcSgwLDAuOCwgYnkgPSAwLjIpLCBzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiU3BlY2llcyB0dXJub3ZlciIpICsNCiAgbGZlaGVSOjp0aGVtZShiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKA0KICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiksDQogICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4odCA9IC0xMCwgdW5pdCA9ICJwdCIpLA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEwLCAicHQiKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpDQogICAgKQ0KYGBgDQoNCiMjIyMjICoqRGlzY3Vzc2lvbioqDQpTcGVjaWVzIHJpY2huZXNzIHBlciBwbG90IGF0IGFsbCBwYXJrcyB3YXMgc2ltaWxhciB0byB0aGF0IG9mIG90aGVyIHNhbHQgbWFyc2hlcyBhbG9uZyB0aGUgZWFzdGVybiBBdGxhbnRpYyBjb2FzdCBvZiBOb3J0aCBBbWVyaWNhIChjaXRhdGlvbnMgaGVyZSkuDQoNCnwgICBUaGUgc2FsdCBtYXJzaCBwbGFudCBjb21tdW5pdHkgYXQgQVNJUyBoYXMgc2VlbiBhIHJlZHVjdGlvbiBpbiB0b3RhbCBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKEZpZ3VyZSAzYSksIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAoRmlndXJlIDRhKSwgYW5kIGNvdW50IGFuZCBjb3ZlciBvZiBsb3cgc2FsaW5pdHkgdG9sZXJhbnQgc3BlY2llcyAoRmlndXJlIDZhIGFuZCA2YykuIFRoZSBjaGFuZ2VzIGluIHRoaXMgY29tbXVuaXR5IGFyZSBtb3N0IGxpa2VseSBhIGNvbnNlcXVlbmNlIG9mIGJvdGggY2xpbWF0ZSBjaGFuZ2UsIGxhbmQtdXNlIGNoYW5nZSwgYW5kIHNlYS1sZXZlbCByaXNlLiBNb3JlIHNwZWNpZmljYWxseSwgaW5jcmVhc2VzIGluIGV2YXBvdHJhbnNwaXJhdGlvbiBkdWUgdG8gYWJvdmUgYXZlcmFnZSBhaXIgdGVtcGVyYXR1cmVzIGFuZCBvciBiZWxvdyBhdmVyYWdlIHByZWNpcGl0YXRpb24gcmVzdWx0aW5nIGZyb20gY2xpbWF0ZSBjaGFuZ2UgaGF2ZSBsZWQgdG8gZWxldmF0ZWQgc2FsaW5pdGllcyB3aXRoaW4gdGhlIHNoYWxsb3cgY29hc3RhbCB3YXRlcnMgc3Vycm91bmRpbmcgdGhlIG1hcnNoZXMuIFNpbWlsYXJseSwgYmVsb3cgYXZlcmFnZSBwcmVjaXBpdGF0aW9uIGhhcyBhbHNvIGxpa2VseSB0aGUgZGVjcmVhc2VkIGZsb3cgb2YgdHJpYnV0YXJpZXMgdG8gdGhlIGNvYXN0YWwgYmF5cywgd2hpY2ggYWxzbyBjb250cmlidXRlcyB0byBlbGV2YXRlZCBzYWxpbml0aWVzLiBGaW5hbGx5LCBzZWEtbGV2ZWwgcmlzZSBpcyBsaWtlbHkgZGVjcmVhc2luZyB0aGUgZWxldmF0aW9uIG9mIHRoZSBtYXJzaGVzIGFuZCBwdXNoaW5nIHNhbHQgd2F0ZXIgZmFydGhlciBpbmxhbmQgaW50byBtYXJzaCBhcmVhcyB0aGF0IHdlcmUgbm90IHByZXZpb3VzbHkgaW51bmRhdGVkIHdpdGggc2FsdCB3YXRlciwgc3VjaCB0aGF0IHNvbWUgbGVzcyBzYWx0IHRvbGVyYW50IHNwZWNpZXMgYXJlIGRpc2FwcGVhcmluZy4gQWRkaXRpb25hbGx5LCB0aGUgc3RhYmlsaXR5IGluIHRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSAoRmlndXJlIDZiKSBvZiBzcGVjaWVzIHdpdGhpbiBhbGwgc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3JpZXMgd291bGQgc3VnZ2VzdCB0aGF0IGVpdGhlciAoYSkgdGhlIHRvdGFsIGFyZWEgb2YgYWxsIG1hcnNoIGhhYml0YXRzIGlzIGRlY3JlYXNpbmcgKGkuZS4sIGNvbnZlcnRpbmcgdG8gb3BlbiB3YXRlciksIG9yIHRoYXQgKGIpIG1vcmUgc2FsdC10b2xlcmFudCBzcGVjaWVzIG1heSBiZSBtaWdyYXRpbmcgdXAgc2xvcGUgYXQgdGhlIGV4cGVuc2Ugb2YgbGVzcyBzYWx0LXRvbGVyYW50IHNwZWNpZXMgKHNlZSBpbmNyZWFzZSBpbiBjb3ZlciBvZiBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIHNwZWNpZXMgaW4gRmlndXJlIDZjKS4gDQoNCkxpdGVyYXR1cmUgQ2l0ZWQNCg0KTGljaHZhciwgUi5XLiwgRC5MLiBCYW5rcywgVy5OLiBLaXJjaG5lciwgYW5kIE4uQy4gTWVsdmluLiAyMDE2LiBUaGUgTmF0aW9uYWwgV2V0bGFuZCBQbGFudCBMaXN0OiAyMDE2IHdldGxhbmQgcmF0aW5ncy4gUGh5dG9uZXVyb24gMjAxNi0zMDogMS0xNy4gKFNlZSBhbHNvIHRoZSBvZmZpY2lhbCB3ZWJzaXRlIG9mIHRoZSBOYXRpb25hbCBXZXRsYW5kIFBsYW50IExpc3QuKQ0KDQpTdGF0ZSBvZiBOZXcgWW9yay4gMjAyMi7CoFtOZXcgWW9yayBMYXdzLCBFbnZpcm9ubWVudGFsIENvbnNlcnZhdGlvbiDCpyA5LTE3MF0oaHR0cHM6Ly9sYXcuanVzdGlhLmNvbS9jb2Rlcy9uZXcteW9yay8yMDIyL2Vudi9hcnRpY2xlLTkvdGl0bGUtMTcvOS0xNzA5LykuIE5ldyBZb3JrIERlcGFydG1lbnQgb2YgU3RhdGUuIDIwMjEuwqBbNiBOZXcgWW9yayBDb2RlcywgUnVsZXMgYW5kIFJlZ3VsYXRpb25zIFBhcnQgNTc1OiBQcm9oaWJpdGVkIGFuZCBSZWd1bGF0ZWQgSW52YXNpdmUgU3BlY2llc10oaHR0cHM6Ly9nb3Z0Lndlc3RsYXcuY29tL255Y3JyL0Jyb3dzZS9Ib21lL05ld1lvcmsvTmV3WW9ya0NvZGVzUnVsZXNhbmRSZWd1bGF0aW9ucz9ndWlkPUllOGQzZTdiMDMzOTYxMWU0YmFhMjAwMDA4NDViOGQzZSZvcmlnaW5hdGlvbkNvbnRleHQ9ZG9jdW1lbnR0b2MmdHJhbnNpdGlvblR5cGU9RGVmYXVsdCZjb250ZXh0RGF0YT0oc2MuRGVmYXVsdCkpLg0KDQpVLlMuIEFybXkgQ29ycHMgb2YgRW5naW5lZXJzLiAyMDA5LiBSZWdpb25hbCBzdXBwbGVtZW50IHRvIHRoZSBDb3JwcyBvZiBFbmdpbmVlcnMgV2V0bGFuZCBEZWxpbmVhdGlvbiBNYW51YWw6IE5vcnRoY2VudHJhbCBhbmQgTm9ydGhlYXN0IFJlZ2lvbi4gVS5TLiBBcm15IENvcnBzIG9mIEVuZ2luZWVycywgRW5naW5lZXIgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IENlbnRlciwgRW52aXJvbm1lbnRhbCBMYWJvcmF0b3J5IEVSREMvRUwgVFItMDktMTkuDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3ZlcikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSByZWxfcGVyY2VudF9jb3ZlciwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYyhFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAicmVsX3BlcmNlbnRfY292ZXIiKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4obWVhbl9jb3ZlciwgbmEucm0gPSBUUlVFKSkgDQoNCmZycSA8LSBzaXRlX3ZlZ19mcnFfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIGZycSkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSBmcnEsIHZhbHVlc19maWxsID0gMCkgJT4lDQogIHBpdm90X2xvbmdlciguLCBjb2xzID0gLWMoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociksIG5hbWVzX3RvID0gIlNjaU5hbWVfY29yIiwgdmFsdWVzX3RvID0gImZycSIpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9mcnEgPSBtZWFuKGZycSwgbmEucm0gPSBUUlVFKSkNCg0KaW1wIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3ZlcikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSByZWxfcGVyY2VudF9jb3ZlciwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYyhFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAicmVsX3BlcmNlbnRfY292ZXIiKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4oLiwgc2l0ZV92ZWdfZnJxX3VzZGEgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCBmcnEpLCANCiAgICAgICAgICAgIGJ5ID0gYygiVW5pcXVlSUQiLCAiVW5pdENvZGUiLCAiWWVhcl9jaHIiLCAiU2NpTmFtZV9jb3IiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKGltcCA9ICgoKG1lYW5fY292ZXIvMTAwKSArIGZycSkvMikqMTApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGltcCkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9pbXAgPSBtZWFuKGltcCwgbmEucm0gPSBUUlVFKSkNCg0KdG9wNWNvdmVyIDwtIGNvdmVyICU+JSANCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX2NvdmVyLCBuID0gNSkgJT4lDQogIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdCgtYyhFdmVudElELCBVbmlxdWVJRCwgU2NpTmFtZV9vYnMsIFN1YnVuaXRDb2RlLCBZZWFyX2NociwgRGF0ZSwgUGVyY2VudENvdmVyLCByZWxfcGVyY2VudF9jb3ZlciwgdG90YWxfcGVyY2VudF9jb3ZlcikpICU+JSBkaXN0aW5jdCgpLCBieSA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBtdXRhdGUoYW5udWFsID0gaWZfZWxzZShEdXJhdGlvbiA9PSAiQW5udWFsIiwgIkEiLCAiIiksDQogICAgICAgICBncmFtaW5vaWQgPSBpZl9lbHNlKEdyb3d0aEhhYml0ID09ICJHcmFtaW5vaWQiLCAiRyIsICIiKSwNCiAgICAgICAgIHdldGxhbmRfc3RhdHVzID0gaWZfZWxzZShpcy5uYSh3ZXRsYW5kX3N0YXR1cyksICIiLCB3ZXRsYW5kX3N0YXR1cyksDQogICAgICAgICBvYmwgPSBpZl9lbHNlKHdldGxhbmRfc3RhdHVzID09ICJPQkwiLCAiTyIsICIiKSwNCiAgICAgICAgIGludiA9IGlmZWxzZShpZl9hbnkoc3RhcnRzX3dpdGggPSAiaW52YXNpdmUiLCAuZm5zID0gfiAuICVpbiUgVFJVRSksICJJIiwgIiIpLA0KICAgICAgICAgY2hhcmFjdGVyaXN0aWNzX2NvdmVyID0gcGFzdGUwKGFubnVhbCwgZ3JhbWlub2lkLCBvYmwsIGludikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgbWVhbl9jb3ZlciwgInNjaW5hbWVfY292ZXIiID0gU2NpTmFtZV9jb3IsIGNoYXJhY3RlcmlzdGljc19jb3ZlcikgJT4lDQogIG11dGF0ZShzY2luYW1lX2NvdmVyID0gaWZfZWxzZShzY2luYW1lX2NvdmVyICVpbiUgYygiU2FsaWNvcm5pYSIsICJTdWFlZGEiKSwgcGFzdGUwKHNjaW5hbWVfY292ZXIsICIgc3BwLiIpLCBzY2luYW1lX2NvdmVyKSkNCg0KdG9wNWZycSA8LSBmcnEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9mcnEsIG4gPSA1KSAlPiUNCiAgbGVmdF9qb2luKC4sIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KC1jKEV2ZW50SUQsIFVuaXF1ZUlELCBTY2lOYW1lX29icywgU3VidW5pdENvZGUsIFllYXJfY2hyLCBEYXRlLCBQZXJjZW50Q292ZXIsIHJlbF9wZXJjZW50X2NvdmVyLCB0b3RhbF9wZXJjZW50X2NvdmVyKSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gYygiVW5pdENvZGUiLCAiU2NpTmFtZV9jb3IiKSkgJT4lDQogIG11dGF0ZShhbm51YWwgPSBpZl9lbHNlKER1cmF0aW9uID09ICJBbm51YWwiLCAiQSIsICIiKSwNCiAgICAgICAgIGdyYW1pbm9pZCA9IGlmX2Vsc2UoR3Jvd3RoSGFiaXQgPT0gIkdyYW1pbm9pZCIsICJHIiwgIiIpLA0KICAgICAgICAgd2V0bGFuZF9zdGF0dXMgPSBpZl9lbHNlKGlzLm5hKHdldGxhbmRfc3RhdHVzKSwgIiIsIHdldGxhbmRfc3RhdHVzKSwNCiAgICAgICAgIG9ibCA9IGlmX2Vsc2Uod2V0bGFuZF9zdGF0dXMgPT0gIk9CTCIsICJPIiwgIiIpLA0KICAgICAgICAgaW52ID0gaWZlbHNlKGlmX2FueShzdGFydHNfd2l0aCA9ICJpbnZhc2l2ZSIsIC5mbnMgPSB+IC4gJWluJSBUUlVFKSwgIkkiLCAiIiksDQogICAgICAgICBjaGFyYWN0ZXJpc3RpY3NfZnJxID0gcGFzdGUwKGFubnVhbCwgZ3JhbWlub2lkLCBvYmwsIGludikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChtZWFuX2ZycSwgInNjaW5hbWVfZnJxIiA9IFNjaU5hbWVfY29yLCBjaGFyYWN0ZXJpc3RpY3NfZnJxKSAgJT4lDQogIG11dGF0ZShzY2luYW1lX2ZycSA9IGlmX2Vsc2Uoc2NpbmFtZV9mcnEgJWluJSBjKCJTYWxpY29ybmlhIiwgIlN1YWVkYSIpLCBwYXN0ZTAoc2NpbmFtZV9mcnEsICIgc3BwLiIpLCBzY2luYW1lX2ZycSkpDQoNCnRvcDVpbXAgPC0gaW1wICU+JQ0KICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IG1lYW5faW1wLCBuID0gNSwgd2l0aF90aWVzID0gRkFMU0UpICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzZWxlY3QoLWMoRXZlbnRJRCwgVW5pcXVlSUQsIFNjaU5hbWVfb2JzLCBTdWJ1bml0Q29kZSwgWWVhcl9jaHIsIERhdGUsIFBlcmNlbnRDb3ZlciwgcmVsX3BlcmNlbnRfY292ZXIsIHRvdGFsX3BlcmNlbnRfY292ZXIpKSAlPiUgZGlzdGluY3QoKSwgYnkgPSBjKCJVbml0Q29kZSIsICJTY2lOYW1lX2NvciIpKSAlPiUNCiAgbXV0YXRlKGFubnVhbCA9IGlmX2Vsc2UoRHVyYXRpb24gPT0gIkFubnVhbCIsICJBIiwgIiIpLA0KICAgICAgICAgZ3JhbWlub2lkID0gaWZfZWxzZShHcm93dGhIYWJpdCA9PSAiR3JhbWlub2lkIiwgIkciLCAiIiksDQogICAgICAgICB3ZXRsYW5kX3N0YXR1cyA9IGlmX2Vsc2UoaXMubmEod2V0bGFuZF9zdGF0dXMpLCAiIiwgd2V0bGFuZF9zdGF0dXMpLA0KICAgICAgICAgb2JsID0gaWZfZWxzZSh3ZXRsYW5kX3N0YXR1cyA9PSAiT0JMIiwgIk8iLCAiIiksDQogICAgICAgICBpbnYgPSBpZmVsc2UoaWZfYW55KHN0YXJ0c193aXRoID0gImludmFzaXZlIiwgLmZucyA9IH4gLiAlaW4lIFRSVUUpLCAiSSIsICIiKSwNCiAgICAgICAgIGNoYXJhY3RlcmlzdGljc19pbXAgPSBwYXN0ZTAoYW5udWFsLCBncmFtaW5vaWQsIG9ibCwgaW52KSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KG1lYW5faW1wLCAic2NpbmFtZV9pbXAiID0gU2NpTmFtZV9jb3IsIGNoYXJhY3RlcmlzdGljc19pbXApICU+JQ0KICBtdXRhdGUoc2NpbmFtZV9pbXAgPSBpZl9lbHNlKHNjaW5hbWVfaW1wICVpbiUgYygiU2FsaWNvcm5pYSIsICJTdWFlZGEiKSwgcGFzdGUwKHNjaW5hbWVfaW1wLCAiIHNwcC4iKSwgc2NpbmFtZV9pbXApKQ0KDQp0b3A1c3BlY2llcyA8LSBiaW5kX2NvbHModG9wNWNvdmVyLCB0b3A1ZnJxLCB0b3A1aW1wKQ0KDQpmbGV4dGFibGUoZGF0YSA9IHRvcDVzcGVjaWVzLCBjb2xfa2V5cyA9IGMoIlVuaXRDb2RlIiwgImR1bW15X2NvdmVyIiwgIm1lYW5fY292ZXIiLCAiZHVtbXlfZnJxIiwgIm1lYW5fZnJxIiwgImR1bW15X2ltcCIsICJtZWFuX2ltcCIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKCJBcHBlbmRpeCAxLiBTYWx0IG1hcnNoIHBsYW50IGNvdmVyIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgaGlnaGVzdCByZWxhdGl2ZSBtZWFuIGNvdmVyLCBmcmVxdWVuY3ksIGFuZCBpbXBvcnRhbmNlIHZhbHVlIGluIGVhY2ggcGFyayB1bml0LiBBID0gYW5udWFsIHNwZWNpZXMsIGFsbCBvdGhlcnMgYXJlIGJpZW5uaWFsIG9yIHBlcmVubmlhbDsgRyA9IGdyYW1pbm9pZCBzcGVjaWVzOyBPID0gb2JsaWdhdGUgd2V0bGFuZCBzcGVjaWVzLCBhbGwgb3RoZXJzIG9jY3VyIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHRpbWUgaW4gdXBsYW5kIGNvbmRpdGlvbnMuIikpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9jb3ZlciIsIHZhbHVlID0gYXNfcGFyYWdyYXBoKGFzX2koc2NpbmFtZV9jb3ZlciksIGFzX2NodW5rKCIgIiksIGNoYXJhY3RlcmlzdGljc19jb3ZlcikpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9mcnEiLCB2YWx1ZSA9IGFzX3BhcmFncmFwaChhc19pKHNjaW5hbWVfZnJxKSwgYXNfY2h1bmsoIiAiKSwgY2hhcmFjdGVyaXN0aWNzX2ZycSkpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9pbXAiLCB2YWx1ZSA9IGFzX3BhcmFncmFwaChhc19pKHNjaW5hbWVfaW1wKSwgYXNfY2h1bmsoIiAiKSwgY2hhcmFjdGVyaXN0aWNzX2ltcCkpICU+JQ0KICBjb2xmb3JtYXRfZG91YmxlKC4sIGogPSAzLCBkaWdpdHMgPSAxKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gYyg1LDcpLCBkaWdpdHMgPSAyKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayBVbml0IiwgZHVtbXlfY292ZXIgPSAiU3BlY2llcyIsIG1lYW5fY292ZXIgPSAiQ292ZXIgKCUpIiwgZHVtbXlfZnJxID0gIlNwZWNpZXMiLCBtZWFuX2ZycSA9ICJGcmVxdWVuY3kiLCBkdW1teV9pbXAgPSAiU3BlY2llcyIsIG1lYW5faW1wID0gIkltcG9ydGFuY2UgVmFsdWUiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBobGluZSguLCBpID0gYyg1LDEwLDE1LDIwLDI1KSwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIG1lcmdlX3YoLiwgaiA9IDEpICU+JQ0KICBmaXhfYm9yZGVyX2lzc3VlcygpICU+JQ0KICBwYWRkaW5nKC4sIHBhcnQgPSAiYm9keSIsIHBhZGRpbmcudG9wID0gMywgcGFkZGluZy5ib3R0b20gPSAzKSAlPiUNCiAgYXV0b2ZpdCgpICU+JQ0KICBmaXRfdG9fd2lkdGgobWF4X3dpZHRoID0gNi41KQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMjogU3BlY2llcyBsaXN0cyBmb3IgZWFjaCBwYXJrLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1biA8LSBmdW5jdGlvbihwYXJrX2NvZGUsIGxldHRlciwgcGFyaykgew0KICBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICAgIG11dGF0ZShTY2lOYW1lX2NvciA9IGlmX2Vsc2UoU2NpTmFtZV9jb3IgJWluJSBjKCJBc3RlciIsICJCYXNzaWEiLCAiQnJvbXVzIiwgIkNhcmV4IiwgIkN1c2N1dGEiLCAiQ3lwZXJ1cyIsICJEaWdpdGFyaWEiLCAiRWxlb2NoYXJpcyIsICJFcmFncm9zdGlzIiwgIkdhbGl1bSIsICJJcG9tb2VhIiwgIkhpYmlzY3VzIiwgIkh5ZHJvY290eWxlIiwgIkp1bmN1cyIsICJMZWVyc2lhIiwgIkxlcGlkaXVtIiwgIkxvbmljZXJhIiwgIkx5Y29wdXMiLCAiTWVsaWxvdHVzIiwgIlBhbmljdW0iLCAiUG9seWdvbnVtIiwgIlJvc2EiLCAiUnVidXMiLCAiUnVtZXgiLCAiU2FsaWNvcm5pYSIsICJTY2lycHVzIiwgIlNvbGlkYWdvIiwgIlN1YWVkYSIsICJUeXBoYSIsICJWaXRpcyIpLCBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgc3BwLiIpLCBTY2lOYW1lX2NvcikpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogICAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFya19jb2RlKSAlPiUNCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGFycmFuZ2UoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpICU+JSBkaXN0aW5jdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIGZsZXh0YWJsZSguKSAlPiUNCiAgICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICAgIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIGxheW91dCA9ICJhdXRvZml0IikgJT4lDQogICAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKHBhc3RlMCgiQXBwZW5kaXggMiIsIGxldHRlciwgIi4gU2FsdCBtYXJzaCBwbGFudCBzcGVjaWVzIGxpc3QgZm9yICIsIHBhcmssICIuIFNwZWNpZXMgbGFiZWxlZCB3aXRoIC5zcHAgY291bGQgbm90IGJlIGlkZW50aWZpZWQgYmV5b25kIHRoZSBnZW51cyBsZXZlbC4gQ29tbW9uIG5hbWVzIGFuZCBzeW1ib2xzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFVTREEgUGxhbnRzIGRhdGFiYXNlIChwbGFudHMudXNkYS5nb3YpLiIpKSkgJT4lDQogICAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgU2NpTmFtZV9jb3IgPSAiU3BlY2llcyIsIENvbW1vbk5hbWUgPSAiQ29tbW9uIE5hbWUiLCBBY2NlcHRlZFN5bWJvbCA9ICJTeW1ib2wiKSAlPiUNCiAgICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogICAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICAgIHN0eWxlKGogPSAxLCBwcl90ID0gZnBfdGV4dF9kZWZhdWx0KGl0YWxpYyA9IFRSVUUpKSANCn0NCmBgYA0KDQpgYGB7ciBBcHBlbmRpeCAyQTogU3BlY2llcyBsaXN0cyBmb3IgQVNJUywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkFTSVMiLCBsZXR0ZXIgPSAiQSIsIHBhcmsgPSAiQXNzYXRlYWd1ZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMkI6IFNwZWNpZXMgbGlzdHMgZm9yIENPTE8sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJDT0xPIiwgbGV0dGVyID0gIkIiLCBwYXJrID0gIkNvbG9uaWFsIE5hdGlvbmFsIEhpc3RvcmljYWwgUGFyayIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAyQzogU3BlY2llcyBsaXN0cyBmb3IgRklJUywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkZJSVMiLCBsZXR0ZXIgPSAiQyIsIHBhcmsgPSAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMkQ6IFNwZWNpZXMgbGlzdHMgZm9yIEdBVEUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJHQVRFIiwgbGV0dGVyID0gIkQiLCBwYXJrID0gIkdhdGV3YXkgTmF0aW9uYWwgUmVjcmVhdGlvbiBBcmVhIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDJFOiBTcGVjaWVzIGxpc3RzIGZvciBHRVdBLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiR0VXQSIsIGxldHRlciA9ICJFIiwgcGFyayA9ICJHZW9yZ2UgV2FzaGluZ3RvbiBCaXJ0aHBsYWNlIE5hdGlvbmFsIE1vbnVtZW50IikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDJGOiBTcGVjaWVzIGxpc3RzIGZvciBTQUhJLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiU0FISSIsIGxldHRlciA9ICJGIiwgcGFyayA9ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiKQ0KYGBg